Парсинг DateTime в C#

Нередко, при разработке приложений в 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 получит значение:

05.11.2022 0:00:00

Этим методом удобно пользоваться, когда вы точно знаете формат строки с датой и временем и этот формат не может измениться.

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии