Я пытаюсь проанализировать форматированную дату и время в формате ISO8601 с помощью структуры DateTime .NET.Анализ даты и времени ISO8601 с помощью функции DateTime struct
Для того, чтобы дать полное представление о проблеме, я собираюсь выполнить тесты с использованием как .NET, так и JavaScript. Я сейчас в Британии (British Summer Time, UTC + 01: 00).
Мое понимание ISO8601 является то, что:
- Когда строка с суффиксом "Z", время выражается в UTC.
- Когда строка помечена символом «+/- hh: mm», время выражается в Местное время, когда «+/- hh: mm» выражает смещение от UTC.
Рассмотрим следующий ISO8601 формат даты/времени строки:
"1987-01-05T08:45:30.500+0100"
Учитывая мои пунктов выше, эта строка выражает локальное время «08:45:30», а время UTC из "7:45:30"
Текущий TimeZone Test (.NET)
DateTime now = DateTime.Now;
Console.WriteLine(now.ToLocalTime()); // 27/08/2013 12:02:43
Console.WriteLine(now.ToUniversalTime()); // 27/08/2013 11:02:43
Текущий TimeZone Test (JavaScript)
var now = new Date(Date.now());
now.toString(); // Tue Aug 27 2013 12:03:46 GMT+0100 (GMT Daylight Time)
now.toUTCString(); // Tue, 27 Aug 2013 11:03:46 GMT
Помимо несовершеннолетнего (минуты/секунды) различия между этими двумя примерами, они возвращаются именно то, что я ожидал бы для британского летнего времени (UTC + 01: 00). Минуты/секунды отличаются тем, что я не могу одновременно запускать тест .NET и JavaScript-тест ТОЧНО в то же время.
Так что теперь позволяет использовать мой ISO8601 дату/время отформатированную строку:
Синтаксический ISO8601 Format String (.NET)
DateTime dt = DateTime.Parse("1987-01-05T08:45:30.500+0100");
Console.WriteLine(dt.ToLocalTime()); // 05/01/1987 07:45:30
Console.WriteLine(dt.ToUniversalTime()); // 05/01/1987 07:45:30
Синтаксический ISO8601 Format String (JavaScript)
var dt = new Date("1987-01-05T08:45:30.500+0100");
dt.toString(); // Mon Jan 05 1987 07:45:30 GMT+0000 (GMT Standard Time)
dt.toUTCString(); //Mon, 05 Jan 1987 07:45:30 GMT
Это не похоже на пример, который показывает дату/время «сейчас». Почему это отображается, как будто я нахожусь в британском зимнем времени (UTC + 00: 00), когда примеры «сейчас» отображаются в британском летнем времени (UTC + 01: 00)?
Если я изменю настройки своего часового пояса, я получаю ожидаемые результаты для локального/универсального времени, но если они установлены на мое текущее время/зону, это, кажется, дает несогласованные результаты.
Редактировать: Короче говоря, это как если бы и .NET, и JavaScript игнорировали летнее/британское летнее время (UTC + 01: 00), когда я пытаюсь разобрать строку. Результат был бы правильным для зимы, а также правильным, когда я физически меняю свое время/зону ...но, как есть, это неверно на «any» Машина, которую я тестировал в Великобритании.
Я думаю, что '+ 0100' игнорируется, это может зависеть от« региональных настроек »на локальном компьютере. Я проверил код, и он показал мне '07: 45: 30' против' 02: 45: 30' не так, как в вашем тесте. –
Это то, что вы получаете для жизни/кодирования в часовом поясе UTC ... Parse * always * return local time, но в вашем случае в UTC и локальном - нет-op. –
На самом деле ваш код должен появляться как 'Local: 05/01/1987 07: 45: 30' и' UTC: 05/01/1987 08: 45: 30', '+ 0100' - это просто указать, что время 'UTC', поэтому все локальное время будет« UTC time - 1 ». –