Синтаксический анализ даты и времени

#c# #datetime #iformatprovider

#c# #дата и время #iformatprovider

Вопрос:

Как можно было бы проанализировать 1900-01-01 00:00:00Z в объект DateTime?

         string temp = "1900-01-01 00:00:00Z";
        CultureInfo provider = CultureInfo.InvariantCulture;
        var date = DateTime.ParseExact(temp, "yyyy-MM-dd hh:mm:ssZ", provider);
  

это возвращает меня:

31.12.1899, 19:00:00 вечера

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

1. Время отключено ровно на 5 часов. Вероятно, вам нужно учитывать часовой пояс.

Ответ №1:

Я предполагаю, что вы находитесь в EST. Из этого времени вычитается 5 часов. Может быть, это из-за того, как вы печатаете время? Попробуйте распечатать его в GMT. Или вы могли бы проанализировать его с вашим местным часовым поясом.

Ответ №2:

Как вы отображаете значение? Я подозреваю, что это просто применение вашего местного часового пояса к дате.

Например, попробуйте распечатать:

  • date.Year
  • date.Kind
  • date.Hour

Я предполагаю, что вы увидите, что date это на самом деле UTC DateTime с правильным значением.

К сожалению, это .NET выполняет преобразование часовых поясов для вас неявно, но тогда типы даты и времени в .NET в любом случае оставляют желать лучшего : (

Альтернативой могло бы быть использование DateTimeOffset , которое должно сделать его немного понятнее.

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

1. вам нужно вставить скриншот в рамку

Ответ №3:

Вы можете использовать этот код

         DateTime a;
        var dt = DateTime.TryParse("30/05/1970",out a);
  

Ответ №4:

По умолчанию указанное время соответствует местному часовому поясу вашего компьютера. date.Kind Это должно отражать. Если вместо этого вы хотите, чтобы время было приведено к всемирному времени (UTC), используйте DateTimeStyles.AdjustToUniversal флаг в качестве четвертого параметра для ParseExact .