为什么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.ToStringTimeSpan.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设计师有意识地在DateTimeTimeSpan字符串格式化器之间做出了这样的区别,并且它很安静合理。 这是因为历史上日期/时间的格式不同,因为不同的文化。 .NET试图通过DateTime类型为此提供全球化手段。 但TimeSpan没有得到这样的“全球化”职责,它只是一种代表时间段的类型,它的格式与任何文化细节都没有关系(如果它们曾经存在过),而是在不同的文化中它的格式是不变的设置。