Debug.WriteLine()vs Console.WriteLine()以不同方式处理文化。为什么?

时间:2015-01-19 15:31:58

标签: c# .net culture date-formatting

请考虑以下控制台应用代码:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

DateTime date = new DateTime(2014, 01, 19);

Console.WriteLine("{0}", date); // Prints 19/01/2014
Debug.WriteLine("{0}", date);   // Prints 01/19/2014
Debug.WriteLine(date);          // Prints 19/01/2014

正如评论中所述,当Console.WriteLine()打印19/01/2014Debug.WriteLine()打印01/19/2014

更糟糕的是,Debug.WriteLine("{0}", date)提供了Debug.WriteLine(date) ...

的不同输出

是否期望Debug.WriteLine()忽略该主题的文化设置?

有没有办法让Debug.WriteLine()使用线程的文化设置?或者我必须使用String.Format()并将结果传递给Debug.WriteLine()吗?

(注意:我在Windows 8.1 64位,en-GB上运行此操作,使用带有.Net 4.51的Visual Studio 2013,并调试AnyCPU版本。)

2 个答案:

答案 0 :(得分:12)

这是明确处理的in the source

这也是有道理的 调试输出不应受最终用户文化的影响;无论代码在何处运行,您都希望调试日志保持一致。

答案 1 :(得分:10)

您使用InvariantCulture

使用explicitly ignores the culture的重载
public static void WriteLine(string format, params object[] args) 
{
    TraceInternal.WriteLine(String.Format(CultureInfo.InvariantCulture, format, args));
}

所有其他重载都没有做与文化相关的任何事情。你可以通过使用带string

的重载来解决这个问题
public static void WriteLine(string message, string category)
{
    TraceInternal.WriteLine(message, category);
}

通过这样做:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

DateTime date = new DateTime(2014, 01, 19);

var formatedDate = string.Format("{0}", date);
Console.WriteLine(formatedDate);
Debug.WriteLine(formatedDate);

现在两人都打印:

19/01/2014 00:00:00 
19/01/2014 00:00:00