-3

我面临一个非常奇怪的问题。我正在写入这样的 CSV 文件:

sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}");

Posting Date 是一个DateTime对象,Expiration Date 是一个DateTime?对象。

但是,当我在德国的生产服务器上运行它时,它打印出的日期格式非常不一致。有时我会有这样的日期格式(欧洲风格):

Posting Date,Expiration Date
06.08.2018 11:49,08.07.2018 11:49

有时我会有这样的日期格式(美国风格):

Posting Date,Expiration Date
8/15/2018 7:56:12 AM,10/14/2018 7:56:12 AM

Posting Date 和 Expiration Date 是完全独立的 .NET 对象,但每一行都是一致的 - 即,如果一列是欧洲格式,另一列也是如此。

我尝试像这样设置文化:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

但这似乎没有什么不同。

当我在德国的服务器上运行控制台应用程序时会发生这种情况。

这可能是什么原因造成的?有没有一种方法可以解决它,而不必在ToString每次写日期时都使用格式显式调用?

4

3 回答 3

2

明确设置格式,例如:

sw.WriteLine($"{posting.publishedOn.ToString("MM/dd/yyyy hh:mm tt")},{posting.ExpirationDate?.ToString("MM/dd/yyyy hh:mm tt")??""}");

编辑:刚刚意识到你明确表示你不想要这个解决方案。ToString如果其他人发现您的问题并且是合适的解决方案,我将留下我的答案。

于 2018-09-17T21:15:11.627 回答
1

我相信你只需要像这样设置特定的文化:

CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

于 2018-09-17T21:34:39.570 回答
1

您是否绝对确定序列化总是发生在设置文化的同一个线程中?

因为如果不是,那可能就是问题所在。

只是为了调试它,请在序列化代码之前立即设置当前线程文化并检查问题是否仍然存在,即

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

sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}");
于 2018-09-17T23:10:06.117 回答