为什么C#中DateTime.Parse在不同文化下解析“01/05/2020”结果一致?
单元测试通过原因说明
核心原因
你对en-CA文化的默认日期解析规则的预设认知存在偏差,这是测试通过的根本原因。
具体解释
- 首先可以打印对应文化的默认短日期格式验证:
.NET 中的Console.WriteLine(cultureUs.DateTimeFormat.ShortDatePattern); // 输出 MM/dd/yyyy Console.WriteLine(cultureCa.DateTimeFormat.ShortDatePattern); // 输出 MM/dd/yyyyen-CA(英语加拿大)文化默认配置对齐Windows官方区域设置,英语区加拿大日常使用中确实存在大量MM/DD/YYYY的日期书写习惯,和en-US的默认短日期格式一致;只有fr-CA(法语加拿大)文化的默认短日期格式才是你预期的dd/MM/yyyy。 - 你的测试代码中,
01/05/2020在en-US下会解析为2020年1月5日(月份为1),在默认配置的en-CA下同样解析为2020年1月5日(月份为1),自然满足Assert.Equal(d.Month,c.Month)的断言条件。
业务需求实现方案
如果你的业务要求en-CA必须按DD/MM/YYYY解析日期,不要依赖DateTime.TryParse的默认行为,因为不同操作系统版本、.NET版本的文化默认配置可能存在差异,推荐显式使用DateTime.TryParseExact指定匹配格式:
// en-CA 强制按 DD/MM/YYYY 解析 var caFormat = "dd/MM/yyyy"; DateTime.TryParseExact("01/05/2020", caFormat, cultureCa, DateTimeStyles.None, out var c); // 此时解析结果为2020年5月1日,月份为5,和en-US解析的1月结果不同
内容的提问来源于stack exchange,提问作者user3695992
相关产品推荐
相关产品推荐

