Нередко, при разработке приложений в 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 удобно использовать в том случае, если необходимо самостоятельно обрабатывать исключения, которые могут возникать при парсинге строк с датой и временем.