Почему DateTime.Parse не обрабатывает дату UTC - программирование
Подтвердить что ты не робот

Почему DateTime.Parse не обрабатывает дату UTC

Почему он не может разобрать это:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
4b9b3361

Ответ 1

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

Время UTC обозначается добавлением "Z" в конец временной строки, поэтому ваш код синтаксического анализа должен выглядеть следующим образом:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z");

Из статьи в Википедии по ISO 8601

Если время в UTC, добавьте 'Z' непосредственно после времени без пространство. "Z" - это обозначение зоны для нулевое смещение UTC. "09:30 UTC" поэтому представлены как "09: 30Z" или "0930Z". "14:45:15 UTC" будет "14: 45: 15Z" или "144515Z".

Время UTC также известно как время "Зулу", поскольку "Зулу" является фонетическим алфавитное слово для "Z" .

Ответ 2

Вам нужно указать формат:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture);

Ответ 3

или используйте параметр SetToUniversal DateTimeStyle в вызове

DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles)

Ответ 4

Предполагая, что вы используете формат "o" для своего дат-времени, поэтому у вас есть "2016-07-24T18: 47: 36Z", есть очень простой способ справиться с этим.

Вызов DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime().

Что происходит, когда вы вызываете DateTime.Parse("2016-07-24T18:47:36Z"), вы получаете значение DateTime, установленное в локальный часовой пояс. Таким образом, он преобразует его в локальное время.

ToUniversalTime() изменяет его на UTC DateTime и преобразует его обратно в UTC.

Ответ 5

Это не действительный формат, однако "Tue, 1 Jan 2008 00:00:00 GMT" есть.

Документация написана следующим образом:

Строка, которая включает информацию о часовом поясе и соответствует ISO 8601. Например, первая из следующих двух строк обозначает согласованное универсальное время (UTC); второй обозначает время в часовом поясе на семь часов раньше, чем UTC:

2008-11-01T19: 35: 00.0000000Z

Строка, которая включает в себя обозначение GMT ​​и соответствует временному формату RFC 1123. Например:

Сб, 01 ноя 2008 19:35:00 GMT

Строка, которая включает дату и время вместе с информацией о смещении часового пояса. Например:

03/01/2009 05:42:00 -5: 00

Ответ 6

Чтобы правильно разобрать строку, указанную в вопросе, без ее изменения, используйте следующее:

using System.Globalization;

string dateString = "Tue, 1 Jan 2008 00:00:00 UTC";
DateTime parsedDate = DateTime.ParseExact(dateString, "ddd, d MMM yyyy hh:mm:ss UTC", CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);

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

Ответ 7

Просто используйте это:

var myDateUtc = DateTime.SpecifyKind(DateTime.Parse("Tue, 1 Jan 2008 00:00:00"), DateTimeKind.Utc);

if (myDateUtc.Kind == DateTimeKind.Utc)
{
     Console.WriteLine("Yes. I am UTC!");
}

Вы можете протестировать этот код с помощью онлайн-компилятора С#:

http://rextester.com/

Надеюсь, это поможет.

Ответ 8

Просто замените "UTC" на "GMT" - простую и не сломайте правильно отформатированные даты:

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT"))

Ответ 9

Не уверен, почему, но вы можете перенести DateTime.ToUniversalTime в try/catch и добиться того же результата в большем количестве кода.

Удачи.