Согласно спецификациям, Node JS (ES5) должен использовать текущие правила dts при работе с объектами Date. Текущий означает «на данный момент», а не на конкретную дату. Это не идеально, но на данный момент мне достаточно.
В настоящее время эти правила неверны (из-за изменений в законодательстве Чили).
Простой зонд:
console.info(new Date())
Mon Apr 08 2019 12:48:08 GMT-0300 (Chile Summer Time) {}
показывает «(Летнее время Чили)» в конце строки toString по умолчанию для даты. На самом деле сейчас не летнее время (оно закончилось два дня назад), и текущее смещение должно быть -4, а не -3.
Я попытался обновить Node до последней стабильной версии, и это не сработало. Я не хочу менять много кода (в производстве), чтобы использовать moment.js или его эквивалент.
Есть ли способ обновить правила перехода на летнее время в существующей установке Node JS?
заранее спасибо
-- Редактировать --
Переменная среды TZ пуста.
Протестировано на Mac OSX (Mojave 10.14.4) и Red Hat (4.8.5-36)
moment.js правильно распознает зону ("Америка/Сантьяго" с moment.tz.guess())
Упомянутое вами изменение для Чили было частью Версия данных IANA TZ 2018f, выпущенного в октябре 2018 года.
Node предоставляет версию tz через process.versions.tz
. Текущая поставляемая версия 10.15.3 LTS возвращает 2018e
, что объясняет, почему вы не видите обновление. Я предполагаю, что это будет обновлено в будущем.
Node получает свои данные IANA через ICU. Существуют инструкции для различных способов компиляции поддержки Node ICU (system-icu
, small-icu
, full-icu
), задокументированные здесь, которые применяются, если вы сами создаете Node из исходного кода. Увы, я не могу найти никакого механизма для обновления данных Node ICU напрямую, без самостоятельной сборки Node.
У ICU есть документация о том, как обновить данные о часовом поясе, не обновляя все ICU. однако я нигде не вижу, чтобы Node использовал эту возможность.
Таким образом, когда дело доходит до обновления данных часового пояса Node — либо это невозможно сделать в настоящее время, либо это плохо документировано. Извините, у меня нет лучшего ответа для вас, чем этот.
Вы сказали, что уже использовали момент-часовой пояс, который независимо отправляет данные о часовом поясе. Если вы используете только моментные функции (а не объект Date
), вы должны получить правильный результат.
Спасибо, Мэтт ... отличное объяснение. К сожалению, версия 11.13.0 продолжает использовать 2018e.
Возможный дубликат Летнее время неправильно определено Node.js