Jak ustawić domyślną strefę czasową w node.js?
Jak ustawić domyślną strefę czasową w node.js?
Odpowiedzi:
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ą.
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.
zone.tab
plik w tym archiwum.
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.
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);
Niestety ustawienie process.env.TZ
nie 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.
Rozwiązanie env TZ='Europe/Amsterdam' node server.js
z @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 gulp
przyjmie 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 TZ
zmiennej ś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 .
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-1
to UTC + 1 godzina. Zobaczhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
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,
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
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ść TZ
i swoją strefę czasową np. America/Los Angeles
I zastosuj zmianę.
Możesz sprawdzić efekt, wyświetlając new Date().toString()
w aplikacji Node i zwracając uwagę na sufiks strefy czasowej.
Począwszy od węzła 13 , możesz teraz ustawiać wielokrotnie process.env.TZ
i 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)'
set TZ='UTC' node index.js
Możesz wziąć chwilową strefę czasową . Pozwala ustawić lokalizację, a także dba o czas letni.
Date
innych wbudowanych modułów.
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');
Pracuję z tym pakietem npm unix-system-timezone
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:
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
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
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ę
Możesz wymusić strefę czasową procesu Node.js, ustawiając zmienną środowiskową TZ
naUTC
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"
}
}
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