Как я могу установить часовой пояс по умолчанию в node.js?


154

Как мне установить часовой пояс по умолчанию в node.js?


2
Уверен, ты не сможешь этого сделать. Измените настройки часового пояса системы.
thejh

1
thejh правильно, вы не можете изменить часовой пояс. Используйте библиотеку времени JS (например, moment.js) и вместо этого добавляйте / вычитайте часы.
Alessioalex

2
Самый простой и правильный способ сделать это - просто изменить часовой пояс вашей системы.
Munim

1
Это полезные комментарии, но большую часть времени вы не являетесь системным администратором;)
Марио де Вера

Ответы:


136

Согласно этой ветке группы Google , вы можете установить переменную окружения TZ перед вызовом любых функций даты. Только что проверил и все работает.

> process.env.TZ = 'Europe/Amsterdam' 
'Europe/Amsterdam'
> d = new Date()
Sat, 24 Mar 2012 05:50:39 GMT
> d.toLocaleTimeString()
'06:50:39'
> ""+d
'Sat Mar 24 2012 06:50:39 GMT+0100 (CET)'

Вы не можете изменить часовой пояс позже, так как к тому времени Node уже прочитал переменную окружения.


3
Это интересно. Обсуждение ошибки предполагает, что это связано с многопоточностью. Но пример менял process.env.TZ несколько раз. Похоже, установка одного раза в начале и оставление в покое работает. Спасибо lorancou за ссылку на время узла для более гибкой и надежной обработки.
webjprgm

6
К сожалению, это не работает в Windows. Хорошо работает в Mac OS-X и Unix
Ритеш Кумар Гупта

15
Хороший ответ. К сожалению, каждый раз, когда я вижу что-то вроде process.env.TZ = 'Europe/Amsterdam' «хорошо, теперь, где я могу найти список всех допустимых значений, которые я могу установить?» и я не нахожу это, каждый раз.
Рафаэль Эйнг

5
@RafaelEyng IANA (Международная ассоциация назначенных номеров) часто используется для предоставления современных конфигураций часовых поясов. Вы можете найти последние настройки часового пояса здесь: ftp.iana.org/tz/tzdata-latest.tar.gz Для просмотра возможных строк часового пояса проверьте zone.tabфайл в этом архиве.
JohannesB

9
@RafaelEyng: как упомянул JohannesB, iana.org/time-zones является официальным источником, но с форматом данных с ним сложно работать. Я считаю, что намного проще работать из en.wikipedia.org/wiki/List_of_tz_database_time_zones , который построен из набора данных IANA (в настоящее время версия 2017c).
Питер Руст

66

Другой подход, который, по-видимому, работает для меня, по крайней мере, в среде Linux, состоит в том, чтобы запустить ваше приложение Node.js следующим образом:

env TZ='Europe/Amsterdam' node server.js

Это должно как минимум гарантировать, что часовой пояс установлен правильно с самого начала.


Ницца! У меня работает
Rotem

Можете ли вы сделать то же самое для культур?
Джим Ахо

Это упростило форсирование часового пояса, чем в коде .
Дан Даскалеску

33

Вот 100% работающий пример получения пользовательского часового пояса Date Time в NodeJs без использования каких-либо внешних модулей:

const nDate = new Date().toLocaleString('en-US', {
  timeZone: 'Asia/Calcutta'
});

console.log(nDate);


Я озадачен - это очень одобрено, но у него есть критическая проблема IMO. Версии узла <13 имеют данные о локали только для «en-us», что означает, что они выбрасывают (в некоторых случаях) или дают неправильный формат даты для любой другой страны. И во многих случаях дата будет выглядеть правильно, но день и месяц меняются местами! И Node 13 был выпущен всего несколько недель назад, так что эта проблема касается практически всех.
Том

Я вижу, что ответ @Marshall ниже предлагает способ решить эту проблему в некоторых ситуациях (не будет работать в Lambda и других FaaS).
Том

31

К сожалению, настройка process.env.TZне очень хорошо работает - в принципе, когда изменение вступит в силу, оно не определено).

Так что установка часового пояса системы перед запуском узла - ваш единственный правильный выбор.

Однако, если вы не можете этого сделать, можно использовать время узла в качестве обходного пути: узнать свое время по местному времени или по времени UTC и преобразовать их в нужный часовой пояс. См. Как использовать смещение часового пояса в Nodejs? для деталей.


1
Время модуля npm отлично сработало для меня. я установил на utc, затем установил все время, используя utc, поэтому код переносим между разными машинами с разными часовыми поясами.
Марк Шуст в M.academy

Проблем с этим больше нет, не так ли?
Blok

16

Решение env TZ='Europe/Amsterdam' node server.jsот @uhef работает в тех случаях, когда ваше приложение не работает с разветвленным процессом, но когда вы работаете с разветвленным процессом, особенно когда вы запускаете свое приложение с помощью инструмента сборки, такого как gulp , команда gulpпримет значения env, но процесс, созданный gulp not (ваше приложение).

Чтобы решить эту проблему, вы должны сделать:

$ export TZ="Europe/Amsterdam"; gulp myTask

Это установит TZпеременную среды для всего процесса, запущенного в консоли, с которой вы работаете, включая все последующие процессы, выполняемые после команды gulp в той же консоли, без необходимости export TZ="Europe/Amsterdam";повторного выполнения их с префиксом .


Так как в Амстердаме есть летнее время, это все еще желательный tz для достижения "полуночного UTC" в GMT +1?
FlavorScape,

1
@FlavorScape, который я использую. Etc/UTC Есть также определенные смещения, доступные в Etc, но смещение противоположно тому, что можно было бы ожидать. Etc/GMT-1это UTC + 1 час. Смотритеhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

Установите часовой пояс сервера и используйте синхронизацию NTP. Вот одно из лучших решений для изменения времени сервера.

Перечислить часовые пояса

timedatectl list-timezones

Чтобы установить часовой пояс

sudo timedatectl set-timezone America/New_York

Проверить часовой пояс

timedatectl

Я предпочитаю использовать часовой пояс UTC для своих серверов и баз данных. Любые преобразования должны быть обработаны на клиенте. Мы можем использовать момент.js на стороне клиента.

Также будет легко поддерживать много экземпляров,


2
Хотя moment.js был отличной библиотекой того времени, в настоящее время есть гораздо меньшие альтернативы (например, date-fns ). Момент огромен ; пожалуйста, не рекомендуйте его для клиентских приложений.
Дан Даскалеску

5

Я знаю, что эта ветка очень старая, но я думаю, что это поможет любому, кто попал сюда из Google, как я.

В GAE Flex (NodeJs) вы можете установить переменную окружения TZ (ту, которая управляет всеми датами и часами в приложении) в файле app.yaml, я оставляю вам пример:

app.yaml

# [START env]
env_variables:
  # Timezone
  TZ: America/Argentina/Buenos_Aires

5

Вот ответ для тех, кто развертывает приложение Node.js в Amazon AWS Elastic Beanstalk . Я не видел этого документированного где-либо еще:

В разделе Configuration -> Software -> Environment Propertiesпросто установите пару ключ-значение TZи ваш часовой пояс, например America/Los Angeles, и примените изменение.

Вы можете проверить эффект, выведя new Date().toString()в приложение Node и обратив внимание на суффикс часового пояса.


3

Начиная с Узла 13 , теперь вы можете многократно устанавливать, process.env.TZи это будет отражаться в часовом поясе новых объектов Date. Я не знаю, использовал бы я это в производственном коде, но это определенно было бы полезно в модульных тестах.

> process.env.TZ = 'Europe/London';
'Europe/London'
> (new Date().toString())
'Fri Mar 20 2020 09:39:59 GMT+0000 (Greenwich Mean Time)'

> process.env.TZ = 'Europe/Amsterdam';
'Europe/Amsterdam'
> (new Date().toString())
'Fri Mar 20 2020 10:40:07 GMT+0100 (Central European Standard Time)'

1
Это прекрасно работает на Linux / Mac, но не работает на Windows.
Nate

Нет, это работает и для Windows, используйтеset TZ='UTC' node index.js
user3896501

@ user3896501 нет, этот синтаксис устанавливает переменную env для всего процесса - не во время работы, как в примере с OP.
Ян Грейнджер

2

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


2
Момент довольно тяжелый для такой задачи, и я бы не рекомендовал ее, если только желаемое поведение невозможно с помощью Dateдругих встроенных модулей.
Крис Уильямсон

2

Иногда вы можете запускать код на виртуальном сервере в другом месте - это может испортиться при запуске NODEJS или других разновидностей.

Вот исправление, которое позволит вам легко использовать любой часовой пояс.

Проверьте здесь список часовых поясов

Просто поместите фразу о часовом поясе в скобки строки FORMAT.

В данном случае - я конвертирую EPOCH в восточный.

//RE: https://www.npmjs.com/package/date-and-time
const date = require('date-and-time');

let unixEpochTime = (seconds * 1000);
const dd=new Date(unixEpochTime);
let myFormattedDateTime = date.format(dd, 'YYYY/MM/DD HH:mm:ss A [America/New_York]Z');
let myFormattedDateTime24 = date.format(dd, 'YYYY/MM/DD HH:mm:ss [America/New_York]Z');


1

Обновление для node.js v13

Как отметил @Tom, полная поддержка icu теперь встроена в v13. Таким образом, шаги настройки могут быть опущены. Вы все еще можете настроить, как вы хотите создать или использовать icu во время выполнения: https://nodejs.org/api/intl.html

Для node.js в Windows вы можете сделать следующее:

  1. Установите full-icu, если он был установлен, который правильно применяет локали дат

    npm i full-icu или глобально: npm i -g full-icu

  2. Используйте toLocaleString () в вашем коде, например:

    new Date().toLocaleString('en-AU', { timeZone: 'Australia/Melbourne' })

    Это будет производить что - то вроде: 25/02/2019, 3:19:22 pm. Если вы предпочитаете 24 часа, en-GB выдаст:25/02/2019, 15:19:22

Для node.js в качестве веб-приложения Azure , в дополнение к настройкам приложения WEBSITE_TIME_ZONE, вам также необходимо установить для NODE_ICU_DATA, например <your project>\node_modules\full-icu, конечно, после того, как вы сделали npm i full-icu. Глобальная установка пакета в Azure не рекомендуется, так как этот каталог является временным и может быть удален.

Ссылка: 1. NodeJS неправильно применяет локали дат

  1. Вы также можете создать node.js с параметрами intl, более подробную информацию здесь

1
full-icu включен в стандартную / официальную сборки Node начиная с v13, поэтому описанные выше шаги больше не понадобятся.
Том

1

Вы можете настроить глобальный часовой пояс с помощью библиотеки tzdata:

npm install tzdata -y

После установите свою среду с переменной, например: TZ = Америка / Богота

И тестирование в вашем проекте:

new Date()

Я надеюсь помочь тебе


1

Вы можете применить часовой пояс процесса Node.js, установив переменную окружения TZвUTC

Так что все время будет измеряться в UTC + 00: 00

Полный список: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Пример package.json:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}

Это не работает в Windows. Вы не можете установить TZ env var таким образом. И если вы установите TZ, он не будет распознаваться как часовой пояс по умолчанию для узла.
Nate

-1

просто установите переменную окружения в вашем главном файле, например, index.js или app.js или main.js или как там у вас:

process.env.TZ = "Aisa/Tehran";

это установит часовой пояс, который будет использоваться во всем приложении узла

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.