Как сделать DateTime.Правильно проанализировать

#c# #datetime #tryparse

#c# #datetime #попробуйте проанализировать

Вопрос:

У меня есть следующий метод:

     private DateTime GetDateTimeFromString(string dateTimeStr)
    {
        try
        {
            return DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture);
        }
        catch (Exception ex)
        {
            _logger.Log($"Exception while parsing {dateTimeStr}: {ex.Message}.");

            return DateTime.Now;
        }
    }
  

Когда я запускаю это в Visual Studio, оно работает нормально. Но когда он развертывается в Azure, происходит сбой. Ошибка:

Исключение при синтаксическом анализе 21/4/2019 11:6:56: Строка не была распознана как допустимая дата-время.

Я вставляю 21/4/2019 11:6:56 в отладчик, он работает. Запутался. Может кто-нибудь помочь, пожалуйста?

Пожалуйста, обратите внимание, что в Azure (как в веб-приложении) происходит сбой с CultureInfo или без него.

Также в Azure для моего web.config установлено значение:

 <globalization culture="" uiCulture="" />
  

Комментарии:

1. Проверьте настройки языка на хост-компьютере.

2. @MarkBenningfield, спасибо за ответ. Это веб-приложение. Приведенный выше код завершается с ошибкой с параметром cultuerinfo или без него.

3. Я не думаю DateTime.Parse("21/4/2019 11:6:56", CultureInfo.InvariantCulture) , что это когда-либо удастся — вы уверены, что показываете код, который демонстрирует проблему?

4. @AlexeiLevenkov, да. Это было точное копирование и вставка.

Ответ №1:

Вы можете попробовать использовать DateTime .Попробуйте выполнить синтаксический анализ и установить формат синтаксического анализа.

 DateTime dt;

DateTime.TryParseExact("21/4/2019 11:6:56",
                       "dd/M/yyyy hh:m:ss",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None,
                        out dt);
  

Есть две причины, по которым я бы использовал DateTime.TryParseExact вместо DateTime.Parse

  1. DateTime.TryParseExact возврат bool , вы можете обработать его вместо handle Exception . если входная строка не соответствует формату и языку. он вернется false .
  2. Определите Culture формат даты и времени в качестве параметров.

вот так.

 DateTime dt;

if(!DateTime.TryParseExact(dateTimeStr,
                       "dd/M/yyyy hh:m:ss",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None,
                        out dt))
{
    _logger.Log($"Exception while parsing {dateTimeStr}");
    dt = DateTime.Now;
}

return dt;
  

c # онлайн

Комментарии:

1. Большое вам спасибо @D-shih. Это сработало. Я думаю, что я попробовал метод TryParseExact, но я не знаю, что я сделал не так, поскольку получал ошибку. Возможно, я не использовал DateTimeStyles . Спасибо, теперь все хорошо.

2. @Stackedup Нет проблем, рад помочь

3. Осторожно с корпусом. hh это 12-часовые часы. HH составляет 24 часа. Без индикатора am / pm meridiem ( tt ) 12-часовые часы бесполезны, так как вы не сможете определить разницу между 1 am и 1 pm.

Ответ №2:

     string dateTimeStr = "2019-04-35";
    DateTime dateTime;
    if (DateTime.TryParse(dateTimeStr, out dateTime))
    {
        Console.WriteLine(dateTime);
    }
    else
    {
        Console.WriteLine("Invalid");
    }