代码之家  ›  专栏  ›  技术社区  ›  SpleX

DateTime ParseExact仅针对PM时间抛出FormatException

  •  1
  • SpleX  · 技术社区  · 2 年前

    我有一个不同DateTime格式的列表,我想将所有格式转换为一种特定的格式。它工作得很好,直到我按下这条线: 9.13.2023下午2:06:58 。在这条线上我得到一个 系统FormatException 。但是线路 9.13.2023上午6:38:50 工作良好。我是不是忽略了什么?

    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();
    }
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   ipodtouch0218    2 年前

    HH 表示00-23小时,表示24小时时钟。解析器会感到困惑,因为它遇到了一个不可能的场景,它是01(24小时时钟),但也是PM。看到矛盾,解析器只是假设它不能使用这个模式进行匹配,并试图找到另一个模式,结果用完了,并抛出异常,因为没有格式匹配。

    对于12小时时钟(具有AM/PM), use hh or h instead.

    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";