【问题标题】:Why does TimeSpan.ToString() require escaping separators?为什么 TimeSpan.ToString() 需要转义分隔符?
【发布时间】:2014-01-22 08:10:26
【问题描述】:

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

【问题讨论】:

标签: c# datetime timespan


【解决方案1】:

documentation 中所述,DateTime.ToStringTimeSpan.ToString 格式说明符之间的区别之一如下:自定义 TimeSpan 格式说明符不包括占位符分隔符,例如分隔日期的符号从小时,小时从分钟,或秒从小数秒。相反,这些符号必须作为字符串文字包含在自定义格式字符串中

contrastTimeSpan 中(请参阅文档中的格式说明符表),DateTime 格式说明符包括日期分隔符/ 和时间分隔符: 的预定义符号。这意味着例如对于意大利文化,分号将被识别为时间分隔符(而不是文字),并将替换为 . 符号:

    // 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 没有得到这样的“全球化”职责,它只是一种代表时间段的类型,它的格式与任何文化细节无关(如果它们曾经存在的话),而是它的格式在不同的文化背景。

【讨论】:

  • 谢尔盖,DateTime.Now.ToString("hh:mm:ss", CultureInfo.GetCultureInfo("it-IT")) 不输出 '.'代替 ':'。是不是有什么误会?
  • @Anar - 对我来说效果很好,在你的情况下,这可能意味着某些 Windows 设置被覆盖。其他文化格式化程序是否适合您?例如,尝试“Ru-ru”,它应该返回格式为 04.01.2014 的日期
  • 我一遍又一遍地阅读你的答案,直到我几乎理解了所有内容:)。请解释这部分:“......但它的格式(时间跨度)在不同的文化设置中是不变的。”如果格式是常量,那么为什么意大利时间戳包含. 而不是“常量”:?我不明白什么?
  • @Anar - 这句话与TimeSpan 的格式有关,而且这种格式确实是“恒定的”(与文化无关)。我的意大利文化示例与DateTime 有关,相反,它与文化有关。所以这里没有矛盾。
  • 我想我现在明白了。这里的主要概念是DateTime自然形式 是格式化的日期/时间字符串,而TimeSpan 的自然形式是数字(long 变量)。 TimeSpan 的自定义格式不是自然的,而是一种奖励。因此没有预定义的格式选项。是的,我想我现在明白了:)
猜你喜欢
  • 2012-04-06
  • 2011-01-11
  • 2023-03-16
  • 1970-01-01
  • 2021-01-26
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多