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

DateTime.ParseExact抛出String was not recognized as a valid DateTime异常求助

解决DateTime.ParseExact抛出FormatException的问题

嘿,这个问题我之前踩过坑!核心原因很简单:你调用dateTime.ToString()的时候没指定格式,它会用当前系统的默认日期格式生成字符串,而这个格式和你后续ParseExact要求的"dd MMM yyyy HH:mm:ss:fff"完全不匹配,自然就解析失败了。

问题拆解

举个例子,假设你的系统区域是英文(美国),new DateTime(2018,04,26).ToString()会输出类似"4/26/2018 12:00:00 AM"的字符串;如果是中文区域,会输出"2018/4/26 0:00:00"。这两种格式都和"dd MMM yyyy HH:mm:ss:fff"(比如"26 Apr 2018 00:00:00:000")对不上,而ParseExact是严格匹配格式的,所以直接抛出错误。

解决方案

方案1:保持转字符串再解析的逻辑,但统一格式

如果你确实需要把DateTime转成特定格式的字符串再解析回去(虽然有点多此一举,但按你的需求来),一定要在ToString时指定和ParseExact一致的格式,同时建议加上CultureInfo.InvariantCulture避免区域差异(比如不同语言的月份缩写不同):

// 实际代码中日期时间值来自数据库
var dateTime = new DateTime(2018, 04, 26);
// ToString时指定匹配的格式,并用不变文化避免区域问题
var dateStr = dateTime.ToString("dd MMM yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture);
var dtExtract = DateTime.ParseExact(dateStr, "dd MMM yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture);

方案2:直接使用原DateTime对象(更高效)

其实如果你的原始数据已经是DateTime类型了,完全没必要转成字符串再解析——直接赋值就行,这才是最合理的做法:

// 实际代码中日期时间值来自数据库
var dateTime = new DateTime(2018, 04, 26);
var dtExtract = dateTime; // 直接复用原对象,不需要额外转换

额外提示

MMM是月份的缩写形式,不同区域的缩写不一样(比如英文是Apr,中文是四月),所以一定要指定CultureInfo(比如InvariantCulture或者特定的区域文化),否则在不同语言环境下还是会出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:55:26