Узел JS текущие правила DST - PullRequest
       30

Узел JS текущие правила DST

4 голосов
/ 08 апреля 2019

В соответствии со спецификациями, Node JS (ES5) должен использовать текущие правила dts при работе с объектами Date. Текущий означает «на данный момент», а не на конкретную дату. Это не идеально, но мне достаточно в данный момент.

В настоящее время эти правила неверны (из-за изменений в законодательстве Чили).

Простой зонд:

console.log(new Date()) 
Mon Apr 08 2019 12:48:08 GMT-0300 (Chile Summer Time) {}

показывает "(Чилийское летнее время)" в конце строки по умолчанию для даты. На самом деле мы не на летнем времени (оно закончилось два дня назад), и текущее смещение должно быть -4, а не -3.

Я пытался обновить Node до последней стабильной версии и не работал. Я не хочу менять много кода (в производстве), чтобы использовать moment.js или его эквивалент.

Есть ли способ обновить правила DST в существующей установке Node JS?

Заранее спасибо

- Правка -

Переменная окружения TZ пуста.

Протестировано на Mac OSX (Mojave 10.14.4) и Red Hat (4.8.5-36)

moment.js правильно распознает зону («Америка / Сантьяго» с помощью moment.tz.guess ())

1 Ответ

2 голосов
/ 09 апреля 2019

Упомянутое вами изменение для Чили было частью версии данных IANA TZ 2018f , выпущенной в октябре 2018 года.

Узел предоставляет версию tz через process.versions.tz. Текущая версия 10.15.3 LTS возвращает 2018e, что объясняет, почему вы не видите обновления. Я предполагаю, что это будет обновлено в будущем.

Узел получает свои данные IANA через ICU. Существуют инструкции для различных способов компиляции поддержки Node ICU (system-icu, small-icu, full-icu), задокументированные здесь , которые применяются, если вы сами строите Node из исходного кода. Увы, я не могу найти какой-либо механизм для обновления данных ICU Node напрямую, без сборки Node самостоятельно.

ICU имеет документацию о том, как обновить данные часового пояса без обновления всего ICU. однако я нигде не вижу, чтобы Node воспользовался этой возможностью.

Таким образом, когда дело доходит до обновления данных часового пояса узла - либо это невозможно сделать в настоящее время, либо это плохо документировано. Извините, у меня нет лучшего ответа для вас, чем этот.

Вы сказали, что уже используете момент-часовой пояс, который отправляет данные своего часового пояса независимо. Если вы используете только функции момента (а не объект Date), вы должны получить правильный результат.

...