You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#转换31/5/2022 11:00:00 a. m.为DateTime抛异常的解决方法

C# 特殊格式日期字符串转DateTime实现方案

转换失败核心原因有两点:

  • 目标字符串日期部分为日/月/年排序,和多数中文、英文系统默认的月/日/年解析规则不匹配
  • 字符串内的上午标识为带点和空格的a. m.格式,不属于C#内置文化默认支持的标准AM/PM标记格式

直接使用DateTime.Parse/DateTime.TryParse依赖系统默认文化解析,必然会抛出格式异常,需要用精确匹配解析的方法自定义规则处理,步骤如下:

  1. 引入全球化命名空间using System.Globalization;
  2. 基于不受系统环境影响的固定文化,自定义AM/PM标识匹配目标字符串格式
  3. 编写和目标字符串完全匹配的格式模板,调用精确解析方法完成转换

可直接运行的代码示例

直接解析(已知字符串格式固定时使用)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:16:07