У меня есть список различных форматов DateTime, и я хочу преобразовать их все в один конкретный формат. Все работает нормально, пока я не нажму на эту строку: 13.09.2023 14:06:58. В этой строке я получаю исключение System.FormatException. А вот строка 13.09.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();
}





HH для часов 00-23, для 24-часового формата. Парсер запутывается, потому что сталкивается с невозможным сценарием: это 01 (в 24-часовом формате), но также и PM. Увидев противоречие, парсер просто предполагает, что он не может найти совпадение по этому шаблону, и пытается найти другой, но заканчивается и выдает исключение, поскольку ни один формат не соответствует.
Для 12-часового формата времени (с AM/PM) вместо этого используйте hh или h.
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";