C# DateTime.TryParseExact解析"Jun 1"失败的原因与解决
问题描述
编写C#日期解析逻辑时遇到异常:
- 解析"May 1"及其他测试过的日期均能正常运行
- 仅处理包含"Jun"的日期时解析失败
- 已知"Jun"是六月(June)对应的标准3字母月份缩写,属于微软官方自定义日期和时间格式字符串文档明确收录的合法缩写
原始问题代码
var us = new CultureInfo("en-US"); var dateToParse = "Jun 1"; var isSuccessful = DateTime.TryParseExact(dateToParse, "MMMM d", us, DateTimeStyles.None, out DateTime date);
问题根因
感谢@Damien_The_Unbeliever的提示,核心问题是月份格式说明符使用错误:
- 代码中填写的
MMMM是匹配月份完整拼写名称的格式说明符,要求输入的月份部分和对应文化下的月份全拼完全一致 - 3字母长度的月份缩写对应的正确格式说明符为
MMM
容易造成排查困惑的点:"May 1"能正常解析的原因是,May本身既是5月的3字母缩写,也是5月的官方完整拼写,两种写法完全一致,因此用匹配全拼的
MMMM也能命中识别,才会出现仅Jun这类缩写和全拼拼写不一致的月份解析失败的现象。
修复方案
将格式字符串中的MMMM替换为匹配3字母月份缩写的MMM即可,修正后代码如下:
var us = new CultureInfo("en-US"); var dateToParse = "Jun 1"; var isSuccessful = DateTime.TryParseExact(dateToParse, "MMM d", us, DateTimeStyles.None, out DateTime date);
修正后所有3字母缩写格式的日期均可正常解析。
内容的提问来源于stack exchange,提问作者zacko
相关产品推荐
相关产品推荐

