Як я можу встановити часовий пояс за замовчуванням у node.js?


154

Як встановити часовий пояс за замовчуванням у node.js?


2
Досить впевнений, що ви не можете цього реально зробити. Змініть налаштування часового поясу системи.
thejh

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

2
Найпростіший і правильний спосіб зробити це - просто змінити часовий пояс вашої системи.
Мунім

1
Це корисні коментарі, але ви часто не є системним менеджером;)
Mário de Sá Vera

Відповіді:


135

Відповідно до цього потоку групи 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
На жаль, він не працює у вікнах. Добре працює в mac os-x та unix
Ritesh Kumar Gupta

14
Гарна відповідь. На жаль, кожен раз, коли я бачу щось подібне, process.env.TZ = 'Europe/Amsterdam' я думаю, що "приємно, тепер де я можу знайти список усіх дійсних значень, які я можу встановити?" і я не знаходжу його кожного разу.
Рафаель Ейн

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

8
@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

Це повинно хоча б забезпечити правильність встановлення часового поясу вже з самого початку.


Приємно! Для мене працює
Ротем

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

Це спростило застосування часового поясу, ніж спроба зробити це в коді .
Дан Даскалеску

33

Ось 100% робочий приклад для отримання користувальницького часу з часовим поясом у NodeJs без використання зовнішніх модулів:

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

console.log(nDate);


Мені спантеличено - це дуже схвально, але в ньому є критична проблема ІМО. Версії вузлів <13 мають лише локальні дані для "en-us", це означає, що вони передають (у деяких випадках) або надають неправильний формат дати для кожної іншої країни. І в багатьох випадках дата буде виглядати правильно, але день і місяць поміняються місцями! І Node 13 був тільки що випущений кілька тижнів тому, тому ця проблема стосується майже всіх.
Том

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

31

На жаль, налаштування process.env.TZне спрацьовує добре - в основному невизначено, коли зміни стануть ефективними).

Отже, встановити часовий пояс системи перед запуском вузла - ваш єдиний правильний варіант.

Однак, якщо ви не можете цього зробити, слід використовувати можливість вузла-часу як спосіб вирішення: встановити свій час у місцевому або UTC-часі та конвертувати їх у потрібний часовий пояс. Див. Як використовувати зміщення часового поясу в Nodejs? для деталей.


1
Час роботи модуля npm чудово працювало для мене. я встановлюю на utc, потім встановлюю весь час за допомогою utc, тому код є переносним між різними машинами з різними часовими поясами.
Марк Шуст у M.academy

З цим більше немає проблем, чи не так?
Блок

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";ще раз.


Оскільки у Амстердама є DST, це все-таки бажане тс для досягнення "півночі 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 для своїх серверів та баз даних. Будь-які конверсії повинні здійснюватися клієнтом. Ми можемо використовувати moment.js на стороні клієнта.

У багатьох випадках також буде легко підтримувати,


2
У той час, коли moment.js був чудовою бібліотекою в той час, на сьогоднішній день є набагато менші альтернативи (наприклад, дата-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і це відображатиметься в часовому поясі нових об’єктів Дати. Я не знаю, чи використовував би це я у виробничому коді, але це, безумовно, було б корисно в одиничних тестах.

> 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.
Нейт

Ні, він також не працює для Windows, використовуйтеset TZ='UTC' node index.js
user3896501

@ user3896501 ні, цей синтаксис встановлює env var для всього процесу - не під час виконання, як у прикладі ОП.
Ян Грінґер

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()

Я сподіваюся, helpyou


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, він не буде визнаний часовим поясом за замовчуванням Node.
Нейт

-1

просто встановіть змінну середовища у вашому головному файлі, наприклад index.js або app.js або main.js, або будь-яке ім’я вашого файлу:

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

це встановить часовий пояс, який буде використовуватися у всій програмі вузла

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.