为什么TimeSpan.ToString()需要转义分隔符?
您可以为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."
例外。
事实certificate,解决方案是你需要转义':'
字符,如"HH\\:mm\\:ss"
。 请注意,有一个双反斜杠,因为如果只指定一个,它将破坏字符串,因此您也需要转义该字符串。
问题是,为什么.NET Framework开发人员会这样做? 必须有一个合理的理由。 为什么我们不能使用自定义格式说明符而不像我们使用DateTime
对象那样转义它们?
寻找.NET专家来阐明这个主题。
如文档中所述, DateTime.ToString
和TimeSpan.ToString
格式说明符之间的区别之一如下: 自定义TimeSpan格式说明符不包括占位符分隔符符号,例如将小时数从小时,小时与分钟分隔开的符号,或者小秒数秒。 相反,这些符号必须作为字符串文字包含在自定义格式字符串中 。
与TimeSpan
(参见文档中的格式说明符表), DateTime
格式说明符包括Date separator /
预定义符号,以及Time separator :
. 这意味着,例如对于意大利文化,分号将被识别为时间分隔符(不是文字)并将被替换为.
符号:
// 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")));
我认为.NET设计师有意识地在DateTime
和TimeSpan
字符串格式化器之间做出了这样的区别,并且它很安静合理。 这是因为历史上日期/时间的格式不同,因为不同的文化。 .NET试图通过DateTime
类型为此提供全球化手段。 但TimeSpan
没有得到这样的“全球化”职责,它只是一种代表时间段的类型,它的格式与任何文化细节都没有关系(如果它们曾经存在过),而是在不同的文化中它的格式是不变的设置。