DateTime.ParseExact仅对下午时间抛出FormatException问题排查
DateTime解析异常问题排查
现有多种格式的时间字符串需要统一转换为指定格式,多数场景下解析正常,但解析「9.13.2023 2:06:58 PM」时抛出System.FormatException,解析「9.13.2023 6:38:50 AM」却能正常运行,相关代码如下:
string oldDate = oldDateFromFile; string format1 = "MM.dd.yyyy HH:mm"; string format2 = "MM.dd.yyyy HH:mm:ss tt"; string format3 = "M.dd.yyyy HH:mm:ss tt"; string format4 = "M.dd.yyyy H:mm:ss tt"; string formatOutput = "yyyy-MM-dd HH.mm.ss"; string[] formats = { format1, format2, format3, format4 }; var newDate = DateTime.ParseExact(oldDate, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); using (StreamWriter writetext = new StreamWriter($@"{mainFolderPath}\new_date.txt", append: true)) { writetext.WriteLine(newDate.ToString(formatOutput)); writetext.Close(); }
问题原因
核心问题是时间格式符使用错误:
H/HH是24小时制的小时标识(范围0-23),不需要搭配tt(AM/PM时段标识);- 带有
tt的12小时制时间,必须用h/hh(范围1-12)来匹配小时部分。
解析「6:38:50 AM」时,6在12小时制和24小时制中数值相同,所以用H能偶然匹配;但「2:06:58 PM」对应的24小时制小时是14,字符串里的2只能用12小时制的h匹配,用H会因数值不匹配抛出异常。
解决方案
修改所有带tt的格式字符串,将H/HH替换为h/hh:
string format1 = "MM.dd.yyyy HH:mm"; string format2 = "MM.dd.yyyy hh:mm:ss tt"; string format3 = "M.dd.yyyy hh:mm:ss tt"; string format4 = "M.dd.yyyy h:mm:ss tt"; string[] formats = { format1, format2, format3, format4 };
调整后即可正确解析所有带AM/PM标识的12小时制时间字符串。
内容的提问来源于stack exchange,提问作者SpleX
相关产品推荐
相关产品推荐

