为啥不管文化如何,C# DateTime 解析“01/05/2020”都是一样的?

Posted

技术标签:

【中文标题】为啥不管文化如何,C# DateTime 解析“01/05/2020”都是一样的?【英文标题】:Why does C# DateTime parse "01/05/2020" the same regardless of culture?为什么不管文化如何,C# DateTime 解析“01/05/2020”都是一样的? 【发布时间】:2021-10-25 20:02:38 【问题描述】:

我正在寻找帮助我理解为什么这个单元测试通过的人。

本质上,我们希望支持各种日期格式,但 en-CA 应被视为 DD/MM/YYYY,如果客户端使用 en-us 文化,那么我们希望将日期视为 MM/DD/YYYY。我不明白为什么这不是 DateTime.ParseDateTime.TryParse 的默认行为。

[Fact]
public void DateTimeParse()

   var cultureUs = CultureInfo.GetCultureInfoByIetfLanguageTag("en-us");
   DateTime.TryParse("01/05/2020", cultureUs.DateTimeFormat, DateTimeStyles.None, out var d);
    
   var cultureCa = CultureInfo.GetCultureInfoByIetfLanguageTag("en-ca");
   DateTime.TryParse("01/05/2020", cultureCa.DateTimeFormat, DateTimeStyles.None, out var c);
    
   Assert.Equal(d.Month,c.Month);

【问题讨论】:

试试Assert.AreEqual(cultureUs.DateTimeFormat.ShortDatePattern, cultureCa.DateTimeFormat.ShortDatePattern); 是不是也一样? 不过,如果您使用en-GB,会有所不同,因此加拿大人似乎可以将01/05/2020 理解为1 月5 日。 使用 GetCultureInfo 而不是已弃用的 GetCultureInfoByIetfLanguageTag - 这会改变什么吗? 不知道为什么它会解析 - 在我的机器上 cultureCa.DateTimeFormat.GetAllDateTimePatterns() 没有返回任何支持 / 的模式(可能与 this 有关) @GuruStron 在我的机器(macOS,.NET 5)上,它也没有带有 / 的任何内容,但在 sharplab 上确实有带有 / 的模式。 【参考方案1】:

英语(加拿大)的格式可能与您想象的不同。例如代码:

    foreach (var code in new[]  "en-US", "en-CA", "en-GB", )
    
        Console.WriteLine($"Code code");
        var dtf = CultureInfo.GetCultureInfo(code).DateTimeFormat;
        Console.WriteLine(dtf.ShortDatePattern);
        Console.WriteLine(dtf.DateSeparator);
        Console.WriteLine();
    

写道:

代码 en-US 月/日/年 / 代码 en-CA yyyy-MM-dd - 代码 en-GB 日/月/年 /

在我的系统上。

当您使用TryParse(而不是TryParseExact)并且日期时间格式提供程序的标准模式都不匹配时,很难知道会发生什么(?)。

【讨论】:

有趣。我不知道为什么 en-ca DateTimeFormat 默认解析与 en-us 相同。我尝试了 en-ca、en-au、en-uk 并遇到了相同的结果。感谢您提供英文版。 "en-GB" 是 Sweeper 在对您的问题的评论中提到的。 GB 是大不列颠及北爱尔兰联合王国的正确 ISO 代码,@user3695992。

以上是关于为啥不管文化如何,C# DateTime 解析“01/05/2020”都是一样的?的主要内容,如果未能解决你的问题,请参考以下文章

无论文化信息如何,C# 解析为日期时间

C# - 如何在不改变 DateTime 格式的情况下改变文化

C# DateTime ToString 标准文化格式

使用其他文化时错误的 DateTime 解析

DateTime.Now/UtcNow 默认文化 - 客户端还是服务器?

c#日期时间格式