如何消除 .Net DateTime 的 'd' 标准和自定义格式字符串之间的歧义?

How to disambiguate between the 'd' Standard and Custom format strings for .Net DateTime?

在 .Net 应用程序中,我想以固定长度格式设置日期和时间的格式,但当天没有前导零,如下所示:

String.Format("{0:d MMM HH:mm:ss}", DateTime.Now);
"25 Jun 04:21:11"

这适用于一个月中大于 10 天的情况,但(如 documented)不会插入前导 space。现在,以下应提供所需的格式:

String.Format("{0,2:d}", DateTime.Now);
"25/06/2016"

但是,正如所见,使用标准 Short date 格式字符串来格式化日期。我可以使用:

String.Format("{0,2:''d} {0:MMM HH:mm:ss}", DateTime.Now.AddDays(-20));
" 5 Jun 04:21:11"

得到了想要的效果,但是这个好像不是很理想。 让格式化程序使用隔离 d 的自定义格式字符串解释而不是短日期标准格式的解决方法较少吗?

当格式只有一个字符时,要区分自定义格式和标准格式,请使用 % 符号。例如:{0:d} 给出标准日期格式,但 {0:%d} 只给出月份中的第几天。参见 the MSDN docs for more details

所以,你可以这样做:

String.Format("{0,2:%d} {0:MMM HH:mm:ss}", ...

但是,考虑到您也可以只指定 整个 字符串的长度:

String.Format("{0,15:d MMM HH:mm:ss}", ...

当然,这是假设 MMM 的长度始终为三个字符。这对英语来说是正确的(因为 .NET 使用 "Sep" 而不是 "Sept"),但不能保证对所有语言和区域设置都适用。

另请注意,您应该使用 HH 表示 24 小时制。 hh 给出了 12 小时的时间,但如果不使用 tt 来指示子午线名称(am/pm),则没有意义。