C#转换31/5/2022 11:00:00 a. m.为DateTime抛异常的解决方法
C# 特殊格式日期字符串转DateTime实现方案
转换失败核心原因有两点:
- 目标字符串日期部分为
日/月/年排序,和多数中文、英文系统默认的月/日/年解析规则不匹配 - 字符串内的上午标识为带点和空格的
a. m.格式,不属于C#内置文化默认支持的标准AM/PM标记格式
直接使用DateTime.Parse/DateTime.TryParse依赖系统默认文化解析,必然会抛出格式异常,需要用精确匹配解析的方法自定义规则处理,步骤如下:
- 引入全球化命名空间
using System.Globalization; - 基于不受系统环境影响的固定文化,自定义AM/PM标识匹配目标字符串格式
- 编写和目标字符串完全匹配的格式模板,调用精确解析方法完成转换
可直接运行的代码示例
直接解析(已知字符串格式固定时使用)
using System.Globalization; // 初始化自定义解析文化,基于不变文化避免系统区域差异影响 CultureInfo targetCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone(); // 配置匹配源字符串的上下午标识 targetCulture.DateTimeFormat.AMDesignator = "a. m."; targetCulture.DateTimeFormat.PMDesignator = "p. m."; string sourceDateStr = "31/5/2022 11:00:00 a. m."; // 格式串说明:d/M/yyyy 兼容单/双位的日、月,h:mm:ss 匹配12小时制时间,tt匹配自定义的上下午标识 DateTime parseResult = DateTime.ParseExact( sourceDateStr, "d/M/yyyy h:mm:ss tt", targetCulture, DateTimeStyles.None );
解析后得到的parseResult值为2022年5月31日 11:00:00,符合预期。
容错解析(不确定字符串格式100%规范时使用,避免抛异常)
using System.Globalization; string sourceDateStr = "31/5/2022 11:00:00 a. m."; CultureInfo targetCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone(); targetCulture.DateTimeFormat.AMDesignator = "a. m."; targetCulture.DateTimeFormat.PMDesignator = "p. m."; if (DateTime.TryParseExact( sourceDateStr, "d/M/yyyy h:mm:ss tt", targetCulture, DateTimeStyles.None, out DateTime result )) { // 解析成功逻辑,直接使用result即可 } else { // 解析失败的兜底逻辑 }
注意事项
- 格式串中日、月不要写为
dd/MM,否则遇到单数字的月(比如示例中的5月)、日会匹配失败 - 时间部分小时位用小写
h代表12小时制,不要用大写H(24小时制标识),否则会和上下午标记冲突导致解析失败 - 不要直接使用当前线程的默认文化做解析,否则程序部署到不同区域设置的服务器上时,会出现解析规则不匹配的问题
内容的提问来源于stack exchange,提问作者SP Tutorials
相关产品推荐
相关产品推荐

