C# 写入CSV时日期格式不一致

C# 写入CSV时日期格式不一致,c#,.net,datetime,localization,date-formatting,C#,.net,Datetime,Localization,Date Formatting,我面临一个非常奇怪的问题。我正在写入CSV文件,如下所示: sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}"); CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 过帐日期是DateTime对象,过期日期是

我面临一个非常奇怪的问题。我正在写入CSV文件,如下所示:

sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}");
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
过帐日期是
DateTime
对象,过期日期是
DateTime?
对象

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

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

过账日期和到期日期是完全独立的.NET对象,但每一行都是一致的,即如果一列为欧洲格式,那么另一列也将是一致的

我试着这样设置文化:

sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}");
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
但这似乎没有什么不同

当我在德国的服务器上运行console应用程序时,就会发生这种情况


这可能是什么原因造成的?是否有一种方法可以修复它,而不必每次写入日期时都显式调用格式为的
ToString

显式设置格式,例如:

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

编辑:刚刚意识到你明确地说你不想要这个解决方案。我将留下我的答案,以防其他人发现您的问题,
ToString
是一个合适的解决方案。

我相信您只需将特定的文化设置为:


CultureInfo.CurrentUICulture=CultureInfo.CreateSpecificCulture(“en-US”)

您是否绝对确定序列化总是在设置区域性的同一线程中发生

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

为了调试它,请在序列化代码之前立即设置当前线程区域性,并检查问题是否仍然发生,即

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

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

调用格式化的ToString有什么问题?@Papazzo我在我的应用程序中经常这样做-这将是一个麻烦,因为字符串插值可以接受格式化字符串:
$“{someDate:MM/dd/yyyy}”