【问题标题】:Parsing a DateTime containing milliseconds fails for certain cultures. Why?对于某些文化,解析包含毫秒的 DateTime 失败。为什么?
【发布时间】:2010-05-11 13:48:07
【问题描述】:

我正在尝试解析一个包含毫秒的字符串,如下所示:

string s = "11.05.2010 15:03:08.7718687"; // culture: de-CH
DateTime d = DateTime.Parse(s); // works

但是,例如在 de-DE 语言环境下,小数点分隔符是逗号(不是点)。于是例子就变成了:

string s = "11.05.2010 15:03:08,7718687"; // culture: de-DE (note the comma)
DateTime d = DateTime.Parse(s); // throws a FormatException

DateTime.Parse(s) 现在应该抛出 FormatException 对我来说很奇怪,因为它应该使用 CultureInfo.CurrentCulture 进行解析。即使将 CurrentCulture 作为参数明确传递也无济于事。有谁知道为什么这不起作用?解析不考虑 NumberFormatInfo.NumberDecimalSeparator 吗?

【问题讨论】:

  • 在亚秒级时间格式标准化之前的日子(ISO 8601:2004 做到了),那么分隔符是什么并不重要。因此,标准通常不涵盖应该用作亚秒级小数点的内容。目前尚不清楚数字格式信息是否正确,但不一定有更好的选择。我们最近一直在努力解决这个问题(在完全不同的背景下——不是 Windows 平台),但还没有为它想出一个好的系统。再加上向后(内)兼容性让我们有些头疼。

标签: c# parsing datetime cultureinfo


【解决方案1】:

DateTimeFormatInfo 适用于格式化/解析日期,而不是 NumberFormatInfo。 DateTimeFormatInfo 没有定义可以被不同文化重载的“秒/毫秒”分隔符。

Standard Date and Time format strings 中没有一个显示毫秒,除了往返,这似乎对文化不敏感。所以你不应该遇到这种格式的字符串,除非你自己的代码正在生成它。如果您知道您的代码将生成该格式的日期,您可以提供一个自定义格式字符串,该字符串使用逗号作为秒和毫秒之间的分隔符。

【讨论】:

  • 的确,反映DateTime.Parse方法最终导致了这个代码片段:char ch2 = str.Value[str.Index]; if (ch2 == '.') { ParseFraction(ref str, out raw.fraction);这让我相信'。始终是正确的选择,并且对于毫秒的小数分隔符没有官方标准(至少在 .NET 世界中没有)...
猜你喜欢
  • 2013-01-03
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多