为啥不管文化如何,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.Parse
和 DateTime.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# - 如何在不改变 DateTime 格式的情况下改变文化