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
相关产品推荐
相关产品推荐

