如何消除 .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),则没有意义。
在 .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),则没有意义。