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 =newDate()Sat,24Mar201205: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ą.
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.
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).
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 .
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.
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:
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.
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'>(newDate().toString())'Fri Mar 20 2020 09:39:59 GMT+0000 (Greenwich Mean Time)'> process.env.TZ ='Europe/Amsterdam';'Europe/Amsterdam'>(newDate().toString())'Fri Mar 20 2020 10:40:07 GMT+0100 (Central European Standard Time)'
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.
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ć.
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
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.
Nie możesz jednak później zmienić strefy czasowej, ponieważ do tego czasu Node odczytał już zmienną środowiskową.
źródło
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:
Powinno to przynajmniej zapewnić prawidłowe ustawienie strefy czasowej już od samego początku.
źródło
Oto w 100% działający przykład pobierania niestandardowej strefy czasowej Date Time w NodeJs bez użycia zewnętrznych modułów:
źródło
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.
źródło
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 , poleceniegulp
przyjmie wartości env, ale proces stworzony przez gulp nie (twoja aplikacja).Aby rozwiązać ten problem, musisz:
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ściexport TZ="Europe/Amsterdam";
ponownego wykonywania ich z prefiksem .źródło
Etc/UTC
Istnieją również określone przesunięcia dostępne w programieEtc
, 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
Aby ustawić strefę czasową
Zweryfikuj strefę czasową
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,
źródło
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
źródło
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.źródło
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.źródło
set TZ='UTC' node index.js
Możesz wziąć chwilową strefę czasową . Pozwala ustawić lokalizację, a także dba o czas letni.
źródło
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.
źródło
Pracuję z tym pakietem npm unix-system-timezone
źródło
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
źródło
Możesz skonfigurować globalną strefę czasową za pomocą biblioteki tzdata:
Po ustawieniu środowiska zmienną na przykład: TZ = America / Bogota
I testowanie w Twoim projekcie:
Mam nadzieję, że pomogę
źródło
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:
źródło
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:
spowoduje to ustawienie strefy czasowej, która będzie używana w całej aplikacji węzła
źródło