Откуда берутся Node.js откуда берутся данные о часовом поясе?

#node.js #timezone

#node.js #Часовой пояс

Вопрос:

Встроены ли данные о часовом поясе IANA в nodejs в Node.js код или он берет данные из ОС?

Похоже, что у него есть своя версия, поскольку process.versions возвращает версию часового пояса, как указано здесь. Если да, нужно ли мне устанавливать новый Node.js версия для обновления данных о часовом поясе или есть другой способ?

Ответ №1:

Node.js получает свои данные о часовом поясе из библиотеки ICU, известной как Международные компоненты для Unicode, которая также предоставляет артефакты API для получения данных о часовом поясе. Как правило, ни Node.js ни библиотека ICU не запрашивает внешние файлы часового пояса из операционной системы. Библиотека ICU использует свой собственный набор файлов данных, включая данные о часовом поясе IANA, которые собираются во время сборки. Обратите внимание, что tz свойство, предоставляемое process.versions , ссылается на часть данных о часовом поясе как часть библиотеки ICU. Я вернусь к этому позже.

В зависимости от Node.js распределение, в котором вы используете разные варианты сборки, может применяться, как описано в Node.js документы, раздел «Поддержка интернационализации«:

  • «small-icu»: библиотека ICU привязана статически, а также подмножество данных ICU, которые компилируются в исполняемый файл. По-видимому, «small-icu» является обычным вариантом сборки, используемым для Node.js дистрибутивы, предоставляемые Nodejs.org (по крайней мере, для Linux). Однако можно наложить встроенные данные на архив данных ICU, загруженный из файла (см. Документы, раздел «Предоставление данных Icu во время выполнения«). Для загрузки архива существуют различные пакеты NPM, такие как node-icu и full-icu).

  • «full-icu»: то же, что и «small-icu», но с полным набором данных ICU, скомпилированным в исполняемый файл (что приводит к довольно большому исполняемому файлу).

  • «system-icu»: библиотека ICU динамически связана с Node.js исполняемый файл и должен быть установлен в качестве предварительного условия для Node.js установка. Таким образом, библиотека может обновляться независимо от node.js установка.

  • «нет»: библиотека ICU вообще не привязана. следовательно, нет доступных данных о часовом поясе.

Как правило, следует отметить, что архив данных ICU обновляется реже, чем данные о часовом поясе IANA. Поэтому вам, возможно, придется иметь дело с устаревшей информацией о часовом поясе в Node.js даже если вы всегда устанавливаете последнюю Node.js Выпуск LTS. На это указывает tz значение свойств 2018e , которое указывает на довольно старую версию данных о часовом поясе. Текущие данные о часовом поясе IANA датированы мартом 2019 года. Для большинства приложений это должно быть нормально, но если вам нужна максимальная точность, вам нужно искать другие варианты:

  • Получение Node.js дистрибутив, созданный с помощью «system-icu» (или, скорее всего, создайте свой собственный), может быть выбором, однако я не уверен, что вы действительно можете динамически привязывать Node.js с более новой версией библиотеки во время выполнения. На это может быть ограничение.
  • Другим вариантом может быть создание собственного пользовательского архива данных ICU, но это кажется довольно сложным, если вы никогда раньше не имели дела с библиотекой ICU.
  • Другой вариант — использовать Node.js библиотеки, подобные moment-timezone или TimezoneComplete , которые включали свои собственные компиляции часового пояса. Последнее кажется интересным, поскольку подчиненный tzdata пакет, содержащий набор данных о часовом поясе, часто обновляется. Однако недостатком библиотечного подхода является то, что вы вынуждены использовать определенный API, предоставляемый библиотекой, а не «стандартный» Javascript/Node.js API. Это может быть проблематично, в частности, если у вас большая кодовая база для поддержки базы кода в библиотеке, которая обрабатывает объекты даты / времени.

Комментарии:

1. Есть ли способ определить, является ли установленная версия сборкой icu?

2. Проверьте вывод process.config . Он возвращает объект, содержащий переменные, которые также должны содержать свойство icu_small . В моем случае для него установлено значение true. nodejs.org/api/process.html#process_process_version

3. Смотрите также techoverflow.net/2018/09/19 /…

4. @ziv — Я провел еще несколько углубленных исследований по этому вопросу и соответствующим образом пересмотрел свой ответ.