Почему он не может разобрать это:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
Почему он не может разобрать это:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
Невозможно разобрать эту строку, потому что "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" .
Вам нужно указать формат:
DateTime date = DateTime.ParseExact(
"Tue, 1 Jan 2008 00:00:00 UTC",
"ddd, d MMM yyyy HH:mm:ss UTC",
CultureInfo.InvariantCulture);
или используйте параметр SetToUniversal DateTimeStyle в вызове
DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles)
Предполагая, что вы используете формат "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.
Это не действительный формат, однако "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
Чтобы правильно разобрать строку, указанную в вопросе, без ее изменения, используйте следующее:
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 используется для указания, что данная строка является скоординированной универсальной строкой времени.
Просто используйте это:
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!");
}
Вы можете протестировать этот код с помощью онлайн-компилятора С#:
Надеюсь, это поможет.
Просто замените "UTC" на "GMT" - простую и не сломайте правильно отформатированные даты:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT"))
Не уверен, почему, но вы можете перенести DateTime.ToUniversalTime в try/catch и добиться того же результата в большем количестве кода.
Удачи.