为什么 DateTime.ToString() 似乎忽略了线程当前文化?
Why does DateTime.ToString() seem to ignore the thread current culture?
我有这个代码:
var ci = new CultureInfo("it-IT", false);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
var format = "HH:mm\:ssZ";
var formatted = DateTime.Now.ToString( format, ci );
and... 格式恰好在我的机器上是 09:08:32Z
,它的默认文化不同于 "Italy"。 MSDN says 冒号是一个格式说明符,并提供了一个示例,说明如何将未转义的冒号格式化为具有 "it-IT" 文化(我在上面的代码中使用的那个)的点。
在我的代码中,我有一个冒号字符转义和一个未转义,它们都被格式化为冒号。
为什么会这样?为什么线程当前文化似乎被忽略了?
"it-IT"文化的时间分隔符是一个冒号,如果你检查ci.DateTimeFormat.TimeSeparator
就可以看到。估计是MSDN文档有误。
如果确实需要,您可以随时手动更改时间分隔符 (ci.DateTimeFormat.TimeSeparator = "."
)。
编辑: 如评论中所述,似乎 the time separator for the it-IT culture was a dot in .NET 3.5, but was changed to a colon in .NET 4.0.
我有这个代码:
var ci = new CultureInfo("it-IT", false);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
var format = "HH:mm\:ssZ";
var formatted = DateTime.Now.ToString( format, ci );
and... 格式恰好在我的机器上是 09:08:32Z
,它的默认文化不同于 "Italy"。 MSDN says 冒号是一个格式说明符,并提供了一个示例,说明如何将未转义的冒号格式化为具有 "it-IT" 文化(我在上面的代码中使用的那个)的点。
在我的代码中,我有一个冒号字符转义和一个未转义,它们都被格式化为冒号。
为什么会这样?为什么线程当前文化似乎被忽略了?
"it-IT"文化的时间分隔符是一个冒号,如果你检查ci.DateTimeFormat.TimeSeparator
就可以看到。估计是MSDN文档有误。
如果确实需要,您可以随时手动更改时间分隔符 (ci.DateTimeFormat.TimeSeparator = "."
)。
编辑: 如评论中所述,似乎 the time separator for the it-IT culture was a dot in .NET 3.5, but was changed to a colon in .NET 4.0.