C#将URL获取的日期字符串转DateTime时出现输入字符串格式不正确报错如何解决
报错根因与解决办法
你遇到的格式错误核心来自两个问题:
- 输入的日期字符串本身存在逻辑冲突:
2021/05/03 14:54:14 PM中,24小时制的小时数14和午别标识PM不兼容,PM仅适用于12小时制的时间格式 Convert.ToDateTime默认使用当前系统的区域文化规则解析,兼容性低,很容易因为格式、文化规则不匹配抛出异常
排查步骤
- 先确认输入日期字符串的生成规则:明确URL传参的日期是12小时制还是24小时制,示例中的
14:54:14是24小时制写法,不需要后缀PM - 确认解析时使用的区域文化:不同文化的日期分隔符、午别标识、年月日顺序都有差异,默认解析方法受当前运行环境的文化配置影响,跨环境运行时极易失败
- 优先使用带格式声明的安全解析方法,替代容错性低的
Convert.ToDateTime
解决办法
方案1:修正输入字符串(优先选择)
如果可以调整URL传参的生成逻辑,移除冗余的PM标识,或者把24小时制改为12小时制,比如把输入修正为2021/05/03 14:54:14或者2021/05/03 02:54:14 PM,之后用指定格式的方法解析:
using System.Globalization; string time = expiredorno; // 明确指定输入格式和不变文化,避免区域文化差异导致的解析失败 bool parseSuccess = DateTime.TryParseExact(time, "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result); if (parseSuccess) { string timeleft = result.ToString("dd/MM/yyyy HH:mm:ss tt", CultureInfo.CurrentCulture); } else { // 自定义解析失败的兜底逻辑,比如返回参数错误提示、设置默认时间 }
方案2:兼容现有错误输入(无法调整传参时使用)
如果不能修改URL的传参逻辑,先预处理字符串,移除冲突的午别标识之后再解析:
using System.Globalization; string time = expiredorno.Replace(" AM", "").Replace(" PM", ""); bool parseSuccess = DateTime.TryParseExact(time, "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result); if (parseSuccess) { string timeleft = result.ToString("dd/MM/yyyy HH:mm:ss tt", CultureInfo.CurrentCulture); }
内容的提问来源于stack exchange,提问作者farhang hapooli
相关产品推荐
相关产品推荐

