Как я могу установить часовой пояс по умолчанию в 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 уже прочитал переменную окружения.

webjprgm
источник
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

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

uhef
источник
Ницца! У меня работает
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
ElBarto
источник
5

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

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

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

pscl
источник
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

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

rainerhahnekamp
источник
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');
BillyBob - Fire Fight'n PrgrmR
источник
1

я работаю с этим пакетом npm unix-system-timezone

jeriveromartinez
источник
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()

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

Cristhian D
источник
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"
  }
}
user3896501
источник
Это не работает в Windows. Вы не можете установить TZ env var таким образом. И если вы установите TZ, он не будет распознаваться как часовой пояс по умолчанию для узла.
Nate
-1

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

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

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

Алиреза Мортезаи
источник