对于某些文化,解析包含毫秒的DateTime会失败.为什么?

Dej*_*jan 6 c# datetime parsing cultureinfo

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

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

但是,例如在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
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*gan 4

DateTimeFormatInfo 适用于格式化/解析日期,而不是 NumberFormatInfo。DateTimeFormatInfo 未定义可由不同区域性重载的“秒/毫秒”分隔符。

标准日期和时间格式字符串均不显示毫秒(往返除外),无论如何,往返似乎都不区分文化。因此,您不应该遇到这种格式的字符串,除非您自己的代码正在生成它。如果您知道代码将生成该格式的日期,则可以提供一个自定义格式字符串,该字符串使用逗号作为秒和毫秒之间的分隔符。

  • 事实上,反映 DateTime.Parse 方法最终会导致以下代码片段: char ch2 = str.Value[str.Index]; if (ch2 == '.') { ParseFraction(ref str, out raw.fraction); } 这让我相信'.' 始终是正确的选择,并且毫秒的小数分隔符没有官方标准(至少在 .NET 世界中没有)... (2认同)