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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:35:07