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

C#使用DateTime.ParseExact仍报错字符串无法识别为有效日期时间如何解决

报错成因

你使用DateTime.ParseExact时指定的格式字符串,和实际传入的待解析日期字符串格式完全不匹配,具体差异如下:

  • 分隔符不匹配:待解析的日期字符串(示例:10/7/2019 12:00:00 AM)使用/作为年月日的分隔符,你指定的格式为dd-MM-yyyy hh:mm:ss,使用-作为分隔符
  • 日期顺序不匹配:待解析字符串为月/日/年的顺序,你指定的格式为日-月-年的顺序
  • 缺少AM/PM标识匹配:待解析字符串末尾带有12小时制的AM/PM标识,你指定的格式没有添加tt参数匹配该部分
  • 位数规则不匹配:你指定的格式中dd、MM要求日、月必须为两位数字,但示例中的日期10/7/2019的日期部分为单数字7,不满足两位格式要求

修复方案

基础修复

将ParseExact的格式字符串修改为和输入匹配的M/d/yyyy h:mm:ss tt即可:

string strIDODDate = DateTime.ParseExact(ObjIp.ID_ODchangeDate, "M/d/yyyy h:mm:ss tt", CultureInfo.InvariantCulture).ToString("dd-MM-yyyy");

格式说明:

  • M、d:支持1位或2位的月份、日期
  • h:支持1位或2位的12小时制小时数
  • tt:匹配AM/PM标识

更健壮的兼容方案

如果实际业务中存在多种格式的日期输入,可以传入允许的格式数组,同时使用TryParseExact避免直接抛出异常:

string strRFCsDate = DateTime.Now.ToString("dd-MM-yyyy", CultureInfo.InvariantCulture);

if (string.IsNullOrEmpty(ObjIp.ID_ODchangeDate))
{
    Tobj.ID_ODchangeDate = strRFCsDate;
}
else
{
    // 定义所有允许的输入日期格式
    string[] allowedFormats = new string[] {
        "M/d/yyyy h:mm:ss tt",
        "dd-MM-yyyy hh:mm:ss",
        "dd-MM-yyyy hh:mm:ss.fff"
    };
    
    if (DateTime.TryParseExact(ObjIp.ID_ODchangeDate, allowedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime odDate))
    {
        Tobj.ID_ODchangeDate = odDate.ToString("dd-MM-yyyy");
    }
    else
    {
        // 格式不匹配时的兜底逻辑,可根据业务需求调整,比如保留原值、记录错误日志等
        Tobj.ID_ODchangeDate = strRFCsDate;
    }
}

内容的提问来源于stack exchange,提问作者Nadeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:09:02