gpt4 book ai didi

c# - 解释日期 : Console. Writeline 与 string.Format

转载 作者:太空狗 更新时间:2023-10-29 21:44:35 25 4
gpt4 key购买 nike

给定以下 C# 代码:

var dt = DateTime.Now;
Console.WriteLine("{0:MM/dd/yy} ... {1}", dt, string.Format("{0:MM/dd/yy}", dt));

...当短日期(在 Windows 7 下,控制面板 -> 区域和语言 -> 附加设置 -> 日期)设置为美国标准“M/d/yyyy,”我明白了:

06/17/14 ... 06/17/14

但是,当我将短日期更改为“ddd dd MMM yyyy”时,我得到了这个:

06/17/14 ... 06 17 14

我的印象是 Console.WriteLinestring.Format 总是字符串格式的 DateTime 值相同。这种差异的解释是什么?

编辑: 看起来这只发生在标准单元测试输出 (Visual Studio) 中,这是我最初看到问题的地方。当代码在控制台应用程序中执行时,输出为 06 17 14 ... 06 17 14

最佳答案

出现这种情况是因为当 MSTest 将控制台输出重定向到测试窗口时,它会将 CultureInfo.InvariantCulture 传递给与控制台关联的 TextWriter

您可以通过以下方式验证这一点:

var threadCulture = Thread.CurrentThread.CurrentCulture;
var consoleCulture = Console.Out.FormatProvider;

Console.WriteLine(threadCulture.Equals(CultureInfo.InvariantCulture));
Console.WriteLine(consoleCulture.Equals(CultureInfo.InvariantCulture));

除非您更改它,否则线程的当前文化通常类似于 en-US,或者您的计算机设置的任何内容。所以第一项通常是错误的。

但是第二项根据运行的位置而有所不同。作为控制台应用程序,控制台输出区域性应默认为当前线程区域性 - 因此它将为 false。在 XUnit 或 NUnit 测试中,结果也为 false。但在 MSTest 中,结果为真。

如果你深入研究 .NET Framework Reference Source ,你会看到

我不认为 MSTest 测试运行器的源代码是公开的,但可以得出结论,他们必须在某个地方做类似的事情:

Console.Out = new SomeWriter(CultureInfo.InvariantCulture);

SomeWriter 创建测试输出并继承自 TextWriter

另一方面,String.Format 将始终使用线程的当前文化,除非您专门提供不同的文化。

解决此问题的一种方法是将线程的当前文化显式设置为不变文化。

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

关于c# - 解释日期 : Console. Writeline 与 string.Format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24277622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com