Дата создания iso '' 0001-01-01T01: 00: 00 'добавление 16 секунд - PullRequest
0 голосов
/ 31 января 2019

new Date("0001-01-01T01:00:00Z") -> Mon Jan 01 0001 02:50:16 GMT+0150 (Moscow Standard Time)
Неправильное время по Гринвичу: мой часовой пояс GMT+3000, но дата создает GMT+0150

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Часовой пояс - это смещение плюс диапазон дат.Чтобы отформатировать вашу дату, javascript хочет знать, какое смещение часового пояса было для Москвы в нулевой год.Это сложная информация, и она может быть неточной!Вы думаете, что спрашиваете что-то простое, но на самом деле это довольно экстремально.Если вы хотите использовать объект даты для представления длительностей, вы должны взять эпоху в качестве отправной точки.

0 голосов
/ 09 февраля 2019

ответ Pac0 правильный (и вы должны принять этот ответ, поскольку он пришел первым, а не этот).Но только для того, чтобы дать подробное объяснение:

Даты ранее записанной истории часовых поясов отмечены в базе данных часовых поясов как LMT - что означает Местное среднее время .Смещения определяются по широте и долготе города, а не по каким-либо текущим политическим определениям.

Поскольку показанное смещение на 1:50:16 опережает UTC, я могу определить, что часовой пояс вашей системы равен Europe/Minsk,Это видно по в источниках tzdb :

# Zone  NAME          GMTOFF   RULES  FORMAT  [UNTIL]
Zone    Europe/Minsk  1:50:16  -      LMT     1880

Это только первая строка записи зоны для Europe/Minsk, которая говорит, что до 1880 года используйте запись LMTUTC + 1: 50: 16.

Относительно того, почему в нем указано «Московское стандартное время» - эта строка взята из данных Unicode CLDR , которые в /common/supplemental/metaZones.xml файл, который мы видим:

<timezone type="Europe/Minsk">
  <usesMetazone to="1991-03-30 23:00" mzone="Moscow"/>
  <usesMetazone to="2011-03-27 00:00" from="1991-03-30 23:00" mzone="Europe_Eastern"/>
  <usesMetazone to="2014-10-26 22:00" from="2011-03-27 00:00" mzone="Europe_Further_Eastern"/>
  <usesMetazone from="2014-10-26 22:00" mzone="Moscow"/>
</timezone>

Итак, Europe/Minsk использует метазону Moscow вплоть до 1991 года. Затем, используя один из языковых файлов, таких как /common/main/en.xml дляНа английском языке мы можем увидеть фактический текст, назначенный для этой метазоны:

<metazone type="Moscow">
  <long>
    <generic>Moscow Time</generic>
    <standard>Moscow Standard Time</standard>
    <daylight>Moscow Summer Time</daylight>
  </long>
</metazone>

И теперь у вас есть полная картина того, как строка Mon Jan 01 0001 02:50:16 GMT+0150 (Moscow Standard Time) была получена из 0001-01-01T01:00:00Z.

0 голосов
/ 31 января 2019

Для дат вы можете (и, по моему мнению) определять их в формате UTC ISO 8601 "Z" ("ГГГГ-ММ-ДДТЧ: ММ: ССЗ"), так же, как вы это сделали.

Однако, чтобы получить удобное для пользователя строковое представление этих дат, это будет зависеть от вашего клиента и используемого движка Javascript.Вы можете ограничить вывод, если вы явно укажете эталонный часовой пояс с toLocaleString().

    var date = new Date("1990-01-01T01:00:00Z");

    console.log(date.toLocaleString("en-US", {timeZone: "Asia/Jerusalem"}));
    console.log(date.toLocaleString("en-US", {timeZone: "Europe/Moscow"}));
    console.log(date.toLocaleString("en-US", {timeZone: "Africa/Djibouti"}));
    // output on my machine, should be the same on yours : 
    // 1/1/1990, 3:00:00 AM
    // 1/1/1990, 4:00:00 AM
    // 1/1/1990, 4:00:00 AM

    console.log(date.toString());
    // output **on my machine**, should **not** be the same on yours
    // Mon Jan 01 1990 02:00:00 GMT+0100 (Central European Standard Time)

Для проблемы 16 секунд это связано со способом смещения, определяемым правилами для этих дат перед понятием IANAчасовой пояс существует.

Они, вероятно, не имеют смысла в вашем приложении, и я не рекомендую вам использовать такие даты, как 1 января года 0001, в качестве примеров.

Примеры:

    var date = new Date("0001-01-01T01:00:00Z");

    console.log(date.toLocaleString("en-US", {timeZone: "Asia/Jerusalem"}));
    console.log(date.toLocaleString("en-US", {timeZone: "Europe/Moscow"}));
    console.log(date.toLocaleString("en-US", {timeZone: "Africa/Djibouti"}));
    // output on my machine, should be the same on yours : 
    // 1/1/1, 3:20:54 AM
    // 1/1/1, 3:30:17 AM
    // 1/1/1, 3:27:16 AM

    console.log(date.toString());
    // output **on my machine**, should **not** be the same on yours
    // Mon Jan 01 0001 01:09:21 GMT+0009 (Central European Standard Time)

Больше информации здесь (спасибо Йохану Карлссону за ссылку):

https://bugs.chromium.org/p/chromium/issues/detail?id=849404

Самый актуальный комментарий отэта ссылка, я думаю:

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

В 1880 году не было стандартного часового пояса, а смещение часового пояса Америки / Лос-Анджелеса основывалось на его долготе.То же самое относится и к другим часовым поясам.

Также обратите внимание, что во всем мире существует множество часовых поясов, смещение зон (и наличие или отсутствие летнего времени или время начала летнего времени) неоднократно менялось даже с 2000 года (например, Европа / Москва).Изменения в их правильной работе также привели к тому, что сообщается здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...