您可以为DateTime
对象指定自定义格式,如下所示:
DateTime.Now.ToString("HH:mm:ss"); // 19:55:23
但是当我尝试对TimeSpan
这样的对象使用相同的格式时:
DateTime.Now.TimeOfDay.ToString("HH:mm:ss");
我收到"Input string was not in a correct format."
例外。
事实证明,解决方案是您需要转义':'
中的"HH\\:mm\\:ss"
个字符。请注意,有一个双反斜杠,因为如果你只指定一个,它会破坏字符串,所以你也需要转义它。
问题是,为什么.NET Framework开发人员会这样做?必须有一个合理的理由。为什么我们不能使用自定义格式说明符而不像我们使用DateTime
对象那样转义它们?
寻找.NET专家来阐明这个主题。
答案 0 :(得分:9)
如documentation中所述,DateTime.ToString
和TimeSpan.ToString
格式说明符之间的差异如下:自定义TimeSpan格式说明符不包含占位符分隔符符号,例如作为将小时与小时,小时,分钟或小时秒分开的符号。相反,这些符号必须作为字符串文字包含在自定义格式字符串中。
在带有TimeSpan
的{{3}}中(请参阅文档中的格式说明符表),DateTime
格式说明符包含日期分隔符/
的预定义符号,以及时间分隔符{{ 1}}。这意味着,例如对于意大利文化,分号将被识别为时间分隔符(不是文字),并将替换为:
符号:
.
我认为.NET设计师有意识地在 // outputs 09.57.18 instead of 09:57:18 because of Italian culture.
Console.WriteLine(DateTime.Now.ToString("hh:mm:ss", CultureInfo.GetCultureInfo("it-IT")));
和DateTime
字符串格式化器之间做出了这样的区别,并且这是非常合理的。这是因为历史上日期/时间的格式不同,因为不同的文化。 .NET尝试提供全球化的手段以及TimeSpan
类型。但是DateTime
并没有得到这样的“全球化”职责,它只是一种代表时间段的类型,它的格式与任何文化细节都没有关联(如果它们曾经存在过),而是格式化它在不同的文化环境中不变。