Jak mogę ustawić domyślną strefę czasową w node.js?

154

Jak ustawić domyślną strefę czasową w node.js?

Olu
źródło
2
Jestem pewien, że naprawdę nie możesz tego zrobić. Zmień ustawienia strefy czasowej systemu.
thejh
1
thejh ma rację, nie możesz zmienić strefy czasowej. Użyj biblioteki czasu JS (np. Moment.js) i zamiast tego dodaj / odejmij godziny.
alessioalex
2
Najłatwiejszym i prawidłowym sposobem jest po prostu zmiana strefy czasowej systemu.
Munim
1
To są przydatne komentarze, ale przez większość czasu nie jesteś menedżerem systemu;)
Mário de Sá Vera

Odpowiedzi:

135

Zgodnie z tym wątkiem grupy google , możesz ustawić zmienną środowiskową TZ przed wywołaniem jakichkolwiek funkcji daty. Właśnie to przetestowałem i działa.

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

Nie możesz jednak później zmienić strefy czasowej, ponieważ do tego czasu Node odczytał już zmienną środowiskową.

webjprgm
źródło
3
To interesujące. Dyskusja o błędach sugeruje, że jest to problem z wątkami. Ale przykład wielokrotnie zmieniał process.env.TZ. Wygląda na to, że ustawienie go raz na początku i pozostawienie go w spokoju działa. Dzięki lorancou za odniesienie do czasu węzła, dla bardziej elastycznej i niezawodnej obsługi.
webjprgm
6
Niestety nie działa w oknach. Działa dobrze w systemie Mac OS-X i UNIX
Ritesh Kumar Gupta
14
Niezła odpowiedź. Niestety, za każdym razem, gdy widzę coś takiego process.env.TZ = 'Europe/Amsterdam' , jak myślę: „fajnie, teraz gdzie mogę znaleźć listę wszystkich prawidłowych wartości, które mogę ustawić?” i nie znajduję tego za każdym razem.
Rafael Eyng
5
@RafaelEyng IANA (International Assigned Numbers Association) jest często używany do dostarczania aktualnych konfiguracji stref czasowych. Najnowsze ustawienia strefy czasowej można znaleźć tutaj: ftp.iana.org/tz/tzdata-latest.tar.gz Aby uzyskać przegląd możliwych ciągów stref czasowych, sprawdź zone.tabplik w tym archiwum.
JohannesB,
8
@RafaelEyng: jak wspomniał JohannesB iana.org/time-zones jest oficjalnym źródłem, ale ich format danych jest trudny do wykorzystania. O wiele łatwiej jest mi pracować z en.wikipedia.org/wiki/List_of_tz_database_time_zones , który jest zbudowany z zestawu danych IANA (obecnie wersja 2017c).
Peter Rust
66

Innym podejściem, które wydawało mi się działać przynajmniej w środowisku Linux, jest uruchomienie aplikacji Node.js w następujący sposób:

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

Powinno to przynajmniej zapewnić prawidłowe ustawienie strefy czasowej już od samego początku.

uhef
źródło
Miły! Działa dla mnie
Rotem
Czy możesz zrobić to samo dla kultur?
Jim Aho,
To znacznie uprościło wymuszenie strefy czasowej niż próba zrobienia tego w kodzie .
Dan Dascalescu
33

Oto w 100% działający przykład pobierania niestandardowej strefy czasowej Date Time w NodeJs bez użycia zewnętrznych modułów:

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

console.log(nDate);

Vikas Kandari
źródło
Jestem zdziwiony - to jest bardzo pozytywne, ale IMO ma krytyczny problem. Wersje węzła <13 mają tylko dane regionalne dla „en-us”, co oznacza, że ​​zgłasza (w niektórych przypadkach) lub podaje nieprawidłowy format daty dla każdego innego kraju. W wielu przypadkach data będzie wyglądać poprawnie, ale dzień i miesiąc zostaną zamienione! Node 13 został wydany dopiero kilka tygodni temu, więc ten problem dotyczy prawie wszystkich.
Tom
Widzę, że odpowiedź @Marshall poniżej sugeruje sposób rozwiązania tego problemu w niektórych sytuacjach (nie zadziała w Lambdzie i innych FaaS).
Tom
31

Niestety ustawienie process.env.TZnie działa zbyt dobrze - w zasadzie jest nieokreślone, kiedy zmiana będzie skuteczna).

Zatem ustawienie strefy czasowej systemu przed uruchomieniem węzła jest jedyną właściwą opcją.

Jeśli jednak nie możesz tego zrobić, powinno być możliwe użycie czasu węzła jako obejścia: pobierz czasy w czasie lokalnym lub UTC i przekonwertuj je na żądaną strefę czasową. Zobacz Jak korzystać z przesunięcia strefy czasowej w Nodejs? dla szczegółów.

Laurent Couvidou
źródło
1
npm czas modułu działał dla mnie świetnie. Ustawiam utc, a następnie ustawiam cały czas za pomocą utc, więc kod można przenosić między różnymi maszynami z różnymi strefami czasowymi.
Mark Shust w M.academy
Nie ma już z tym problemów, prawda?
Bloke
16

Rozwiązanie env TZ='Europe/Amsterdam' node server.jsz @uhef działa w przypadkach, gdy Twoja aplikacja nie działa z procesem rozwidlonym, ale gdy pracujesz z procesem rozwidlonym, szczególnie podczas uruchamiania aplikacji za pomocą narzędzia do budowania, takiego jak gulp , polecenie gulpprzyjmie wartości env, ale proces stworzony przez gulp nie (twoja aplikacja).

Aby rozwiązać ten problem, musisz:

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

Spowoduje to ustawienie TZzmiennej środowiskowej dla całego procesu uruchomionego w konsoli, na której pracujesz, w tym wszystkich procesów podciągów wykonanych po poleceniu gulp w tej samej konsoli bez konieczności export TZ="Europe/Amsterdam";ponownego wykonywania ich z prefiksem .

Mariano Ruiz
źródło
skoro amsterdam ma czas letni, czy jest to nadal pożądane tz, aby osiągnąć „północ UTC” w GMT +1?
FlavorScape
1
@FlavorScape, którego używam Etc/UTC Istnieją również określone przesunięcia dostępne w programie Etc, ale przesunięcie jest odwrotne niż można by się spodziewać. Etc/GMT-1to UTC + 1 godzina. Zobaczhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk
9

Ustaw strefę czasową serwera i użyj synchronizacji NTP. Oto jedno lepsze rozwiązanie do zmiany czasu serwera.

Aby wyświetlić strefy czasowe

timedatectl list-timezones

Aby ustawić strefę czasową

sudo timedatectl set-timezone America/New_York

Zweryfikuj strefę czasową

timedatectl

Wolę używać strefy czasowej UTC dla moich serwerów i baz danych. Wszelkie konwersje muszą być wykonywane na kliencie. Możemy wykorzystać moment.js po stronie klienta.

Utrzymanie wielu instancji będzie również łatwe,

Prajyot Khandeparkar
źródło
2
Chociaż moment.js był kiedyś świetną biblioteką, obecnie istnieją znacznie mniejsze alternatywy (np. Date-fns ). Chwila jest ogromna ; proszę nie polecać go do aplikacji klienckich.
Dan Dascalescu
5

Wiem, że ten wątek jest bardzo stary, ale myślę, że pomogłoby to każdemu, kto wylądował tutaj z Google, tak jak ja.

W GAE Flex (NodeJs) możesz ustawić zmienną środowiskową TZ (tę, która zarządza wszystkimi strefami czasowymi dat w aplikacji) w pliku app.yaml, zostawiam ci tutaj przykład:

app.yaml

# [START env]
env_variables:
  # Timezone
  TZ: America/Argentina/Buenos_Aires
ElBarto
źródło
5

Oto odpowiedź dla tych, którzy wdrażają aplikację Node.js w Amazon AWS Elastic Beanstalk . Nie widziałem tego udokumentowanego nigdzie indziej:

Pod Configuration -> Software -> Environment Properties, po prostu ustaw parę klucz-wartość TZi swoją strefę czasową np. America/Los AngelesI zastosuj zmianę.

Możesz sprawdzić efekt, wyświetlając new Date().toString()w aplikacji Node i zwracając uwagę na sufiks strefy czasowej.

pscl
źródło
3

Począwszy od węzła 13 , możesz teraz ustawiać wielokrotnie process.env.TZi zostanie to odzwierciedlone w strefie czasowej nowych obiektów Date. Nie wiem, czy użyłbym tego w kodzie produkcyjnym, ale na pewno przydałoby się to w testach jednostkowych.

> 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)'
Nacięcie
źródło
1
Działa to świetnie w systemie Linux / Mac, ale nie działa w systemie Windows.
Nate,
Nie, działa również w systemie Windows, użyjset TZ='UTC' node index.js
user3896501
@ user3896501 no, ta składnia ustawia zmienną env dla całego procesu - nie podczas działania, jak w przykładzie OP.
Ian Grainger
2

Możesz wziąć chwilową strefę czasową . Pozwala ustawić lokalizację, a także dba o czas letni.

rainerhahnekamp
źródło
2
moment jest dość ciężki dla takiego zadania i nie polecałbym go, chyba że zachowanie, którego chcesz, nie jest możliwe za pośrednictwem Dateinnych wbudowanych modułów.
Chris Williamson
2

Czasami możesz uruchamiać kod na serwerze wirtualnym w innym miejscu - może to być mętne podczas uruchamiania NODEJS lub innych smaków.

Oto poprawka, która pozwoli ci łatwo korzystać z dowolnej strefy czasowej.

Sprawdź tutaj listę stref czasowych

Po prostu umieść frazę strefy czasowej w nawiasach w wierszu FORMAT.

W tym przypadku - konwertuję EPOCH na Eastern.

//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
źródło
1

Pracuję z tym pakietem npm unix-system-timezone

jeriveromartinez
źródło
1

Aktualizacja dla node.js v13

Jak zauważył @Tom, pełne wsparcie dla ICU jest teraz wbudowane w v13. Więc kroki konfiguracji można pominąć. Nadal możesz dostosować sposób tworzenia lub używania icu w środowisku wykonawczym: https://nodejs.org/api/intl.html

W przypadku node.js w systemie Windows możesz wykonać następujące czynności:

  1. Zainstaluj full-icu, jeśli został zainstalowany, który prawidłowo stosuje ustawienia regionalne daty

    npm i full-icu lub globalnie: npm i -g full-icu

  2. Użyj toLocaleString () w swoim kodzie, np .:

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

    To będzie produkować coś takiego: 25/02/2019, 3:19:22 pm. Jeśli wolisz 24 godziny, „en-GB” wygeneruje:25/02/2019, 15:19:22

W przypadku node.js jako aplikacji internetowej platformy Azure , oprócz ustawień aplikacji WEBSITE_TIME_ZONE, należy również ustawić NODE_ICU_DATA na np.<your project>\node_modules\full-icu Oczywiście po wykonaniu npm i full-icu. Nie zaleca się globalnego instalowania pakietu na platformie Azure, ponieważ ten katalog jest tymczasowy i można go wyczyścić.

Odniesienie : 1. NodeJS nie stosuje poprawnie ustawień regionalnych daty

  1. Możesz także zbudować node.js z opcjami intl, więcej informacji tutaj
Marszałek
źródło
1
full-icu jest zawarty w standardowych / oficjalnych wersjach Node od wersji 13, więc powyższe kroki nie będą już konieczne.
Tom
1

Możesz skonfigurować globalną strefę czasową za pomocą biblioteki tzdata:

npm install tzdata -y

Po ustawieniu środowiska zmienną na przykład: TZ = America / Bogota

I testowanie w Twoim projekcie:

new Date()

Mam nadzieję, że pomogę

Cristhian D.
źródło
1

Możesz wymusić strefę czasową procesu Node.js, ustawiając zmienną środowiskową TZnaUTC

Więc cały czas będzie mierzony w UTC + 00: 00

Pełna lista: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Przykład package.json:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}
user3896501
źródło
To nie działa w systemie Windows. W ten sposób nie można ustawić zmiennej TZ env var. A jeśli ustawisz TZ, nie zostanie rozpoznany jako domyślna strefa czasowa Node.
Nate,
-1

po prostu ustaw zmienną środowiskową w swoim głównym pliku, taką jak index.js lub app.js lub main.js lub jakakolwiek inna nazwa twojego pliku:

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

spowoduje to ustawienie strefy czasowej, która będzie używana w całej aplikacji węzła

Alireza Mortezaei
źródło