Нередко, при разработке приложений в C#, требуется преобразование какого-либо строкового значения в значение DateTime
. При этом, необходимо учитывать то, что строка может содержать значения даты и времени в различных форматах, которые, в свою очередь, могут зависеть от региональных настроек, например, строки «01.11.2022», «01/11/2022» и «11/01/22» могут содержать информацию об одной и тоё же дате — 1 ноября 2022 года. Сегодня мы рассмотрим некоторые вопросы парсинга DateTime
в C#.
Метод ParseExact
Метод ParseExact
осуществляет анализ строки для получения даты и времени, используя определенной пользователем формат. Например, строка с DateTime
имеет следующий формат: ddMMyyyy. В этом случае, для получения значения DateTime
мы воспользуемся методом ParseExact
следующим образом:
string date = "05112022"; DateTime dt = DateTime.ParseExact(date, "ddMMyyyy", CultureInfo.InvariantCulture);
в результате, переменная dt
получит значение:
Этим методом удобно пользоваться, когда вы точно знаете формат строки с датой и временем и этот формат не может измениться.
Метод Parse
Метод Parse
имеет более широкие возможности по парсингу DateTime
в C#. В отличие от ParseExact
, метод Parse
пробует преобразовать строку в DateTime
, используя для этого информацию как о региональных настройках, так и о всех возможных стандартных форматах, используемых при форматировании строки даты/времени.
Допустим, у нас имеется следующим набор строк, содержащих дату и время:
string[] strDate = new string[] { "08/18/2018 07:22:16", "08/18/2018", "8/2018", "8/18", "07:22:16", "7 PM", "2018-08-18T07:22:16.0000000Z", "2018-08-18T07:22:16.0000000-07:00", "Sat, 18 Aug 2018 07:22:16 GMT", "08/18/2018 07:22:16 -5:00" };
В представленном выше массиве использовались параметры региональных настроек en-US
, следовательно, метод Parse
мы можем использовать следующим образом:
foreach (string str in strDate) { DateTime dt = DateTime.Parse(str, CultureInfo.GetCultureInfo("en-US")); Console.WriteLine($"{dt}"); }
На выходе получим:
18.08.2018 0:00:00
01.08.2018 0:00:00
18.08.2022 0:00:00
05.11.2022 7:22:16
05.11.2022 19:00:00
18.08.2018 13:22:16
18.08.2018 20:22:16
18.08.2018 13:22:16
18.08.2018 18:22:16
Попытка использования метода Parse
с другими региональными настройками (отличными от тем, с которыми были форматированы строки в массиве) приведет к ошибке парсинга.
Методы TryParse и TryParseExact
Методы TryParse
и TryParseExact
удобно использовать в том случае, если вам необходимо самостоятельно обрабатывать исключения, возникающие при парсинге строк. Этим методы возвращают true
в случае успешного разбора строки с датой и временем и false
, если в процессе парсинга произошла ошибка. Например, попробуем использовать метод TryParse
без указания региональных настроек для парсинга строк из массива, представленного выше:
string[] strDate = new string[] { "08/18/2018 07:22:16", "08/18/2018", "8/2018", "8/18", "07:22:16", "7 PM", "2018-08-18T07:22:16.0000000Z", "2018-08-18T07:22:16.0000000-07:00", "Sat, 18 Aug 2018 07:22:16 GMT", "08/18/2018 07:22:16 -5:00" }; foreach (string str in strDate) { DateTime dt; if (DateTime.TryParse(str, out dt)) { Console.WriteLine($"{dt}"); } else Console.WriteLine("Ошибка парсинга"); }
Результат в консоли будет выглядеть следующим образом:
Ошибка парсинга
01.08.2018 0:00:00
Ошибка парсинга
05.11.2022 7:22:16
05.11.2022 19:00:00
18.08.2018 13:22:16
18.08.2018 20:22:16
18.08.2018 13:22:16
Ошибка парсинга
Итого
Для парсинга строк, содержащих значения DateTime
мы можем воспользоваться тремя группами методов: 1) методы ParseExact
удобно использовать, когда дата/время передаются в строго заданном пользовательском формате; 2) методы Parse
используются в том случае, когда строка содержит дат/время в одном из стандартных форматах; 3) методы TryParse
и TryParseExact
удобно использовать в том случае, если необходимо самостоятельно обрабатывать исключения, которые могут возникать при парсинге строк с датой и временем.