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

