【问题标题】:How to disambiguate between the 'd' Standard and Custom format strings for .Net DateTime?如何消除 .Net DateTime 的“d”标准格式字符串和自定义格式字符串之间的歧义?
【发布时间】:2016-06-25 14:39:45
【问题描述】:

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

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

这适用于一个月中大于十天的天数,但(如documented)不插入前导空格。现在,以下内容应提供所需的格式:

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 的自定义格式字符串解释而不是短日期标准格式是否有更少的解决方法?

【问题讨论】:

  • 在日期之前插入一个空格是一件不寻常的事情......为什么您希望日期格式支持它?
  • 因为数字格式通常使用“#”字符作为格式中空白位置的空格符。

标签: c# .net datetime string-formatting


【解决方案1】:

当格​​式只有一个字符时,要区分自定义格式和标准格式,请使用% 符号。例如:{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”),但不能保证适用于所有语言和语言环境。

另请注意,您应该在 24 小时内使用 HHhh 给出了 12 小时的时间,但如果不使用 tt 来表示子午线名称 (am/pm),则毫无意义。

【讨论】:

  • 为了正确起见,我已更新格式以使用“HH”,感谢您在很长的页面末尾找到文档,其中包含强制使用自定义格式说明符的正确方法。
猜你喜欢
  • 2012-08-28
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多