为什么TimeSpan.ToString()需要转义分隔符?

时间:2014-01-04 17:33:20

标签: c# datetime timespan

您可以为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专家来阐明这个主题。

1 个答案:

答案 0 :(得分:9)

documentation中所述,DateTime.ToStringTimeSpan.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并没有得到这样的“全球化”职责,它只是一种代表时间段的类型,它的格式与任何文化细节都没有关联(如果它们曾经存在过),而是格式化它在不同的文化环境中不变。