Ich bin mir ziemlich sicher, dass du das nicht wirklich kannst. Ändern Sie die Zeitzoneneinstellungen des Systems.
Thejh
1
thejh ist richtig, Sie können die Zeitzone nicht ändern. Verwenden Sie eine JS-Zeitbibliothek (wie moment.js) und addieren / subtrahieren Sie stattdessen Stunden.
Alessioalex
2
Der einfachste und richtige Weg, dies zu tun, besteht darin, einfach die Zeitzone Ihres Systems zu ändern.
Munim
1
Dies sind nützliche Kommentare, aber die meiste Zeit sind Sie nicht der Systemmanager;)
Mário de Sá Vera
Antworten:
135
Gemäß diesem Google-Gruppenthread können Sie die TZ-Umgebungsvariable festlegen, bevor Sie Datumsfunktionen aufrufen. Einfach getestet und es funktioniert.
> 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)'
Sie können die Zeitzone jedoch später nicht mehr ändern, da Node die Umgebungsvariable bereits gelesen hat.
Das ist interessant. Die Fehlerdiskussion deutet darauf hin, dass es ein Problem mit dem Threading gibt. Das Beispiel änderte jedoch process.env.TZ mehrmals. Es sieht so aus, als würde man es am Anfang einmal einstellen und es in Ruhe lassen. Vielen Dank an Lorancou für den Hinweis auf die Knotenzeit für eine flexiblere und robustere Handhabung.
Webjprgm
6
Leider funktioniert es nicht in Windows. Funktioniert gut in Mac OS-X und Unix
Ritesh Kumar Gupta
14
Gute Antwort. Leider process.env.TZ = 'Europe/Amsterdam' denke ich jedes Mal, wenn ich so etwas wie "schön, wo finde ich jetzt eine Liste aller gültigen Werte, die ich einstellen kann?" und ich finde es nicht jedes Mal.
Rafael Eyng
5
@RafaelEyng Die IANA (International Assigned Numbers Association) wird häufig zur Bereitstellung aktueller Zeitzonenkonfigurationen verwendet. Die neuesten Zeitzoneneinstellungen finden Sie hier: ftp.iana.org/tz/tzdata-latest.tar.gz Eine Übersicht über die möglichen Zeitzonenzeichenfolgen finden Sie in der zone.tabDatei in diesem Archiv.
JohannesB
8
@RafaelEyng: Wie JohannesB erwähnte, ist iana.org/time-zones die offizielle Quelle, aber das Datenformat ist schwer zu bearbeiten. Ich finde es viel einfacher, mit en.wikipedia.org/wiki/List_of_tz_database_time_zones zu arbeiten , das aus dem IANA-Datensatz (derzeit die 2017c-Version) erstellt wurde.
Peter Rust
65
Ein anderer Ansatz, der zumindest in einer Linux-Umgebung für mich zu funktionieren schien, besteht darin, Ihre Node.js-Anwendung wie folgt auszuführen:
env TZ='Europe/Amsterdam' node server.js
Dies sollte zumindest sicherstellen, dass die Zeitzone bereits von Anfang an richtig eingestellt ist.
Hier ist ein 100% funktionierendes Beispiel für das Abrufen einer benutzerdefinierten Zeitzone Datum Uhrzeit in NodeJs ohne Verwendung externer Module:
Ich bin verwirrt - das ist sehr positiv, aber es hat ein kritisches Problem, IMO. Knotenversionen <13 enthalten nur Gebietsschemadaten für 'en-us', was bedeutet, dass sie (in einigen Fällen) auslösen oder für jedes andere Land das falsche Datumsformat angeben. In vielen Fällen sieht das Datum korrekt aus, aber Tag und Monat werden vertauscht! Und Node 13 wurde erst vor ein paar Wochen veröffentlicht, sodass dieses Problem für so ziemlich jeden gilt.
Tom
Ich sehe, dass die Antwort von @Marshall unten einen Weg vorschlägt, dies in einigen Situationen zu lösen (funktioniert nicht in Lambda und anderen FaaS).
Das Einstellen der Zeitzone des Systems vor dem Starten des Knotens ist daher Ihre einzig richtige Option.
Wenn Sie dies jedoch nicht tun können, sollte es möglich sein, die Knotenzeit als Problemumgehung zu verwenden: Ermitteln Sie Ihre Zeiten in lokaler oder UTC-Zeit und konvertieren Sie sie in die gewünschte Zeitzone. Siehe Verwenden des Zeitzonenversatzes in Nodejs. für Details.
Die npm-Modulzeit hat für mich großartig funktioniert. Ich setze auf utc und setze dann alle Zeiten mit utc, so dass Code zwischen verschiedenen Maschinen mit verschiedenen Zeitzonen portierbar ist.
Mark Shust an der M.academy
Es gibt keine Probleme mehr damit, oder?
Bloke
16
Die Lösung env TZ='Europe/Amsterdam' node server.jsvon @uhef funktioniert in Fällen, in denen Ihre App nicht mit einem Forked-Prozess funktioniert. Wenn Sie jedoch mit einem Forked-Prozess arbeiten, insbesondere wenn Sie Ihre App mit einem Build- Tool wie gulp starten , gulpübernimmt der Befehl die env-Werte der prozess von gulp nicht erstellt (deine app).
Um dies zu lösen, müssen Sie Folgendes tun:
$ export TZ="Europe/Amsterdam"; gulp myTask
Dadurch wird die TZUmgebungsvariable für alle Prozesse festgelegt, die in der Konsole gestartet werden, an der Sie arbeiten. Dazu gehören alle nach dem Befehl gulp ausgeführten Teilprozesse in derselben Konsole, ohne dass sie erneut mit dem Präfix ausgeführt export TZ="Europe/Amsterdam";werden müssen.
Ist dies nach der Sommerzeit in Amsterdam immer noch der wünschenswerte Wert, um "Mitternacht UTC" bei GMT +1 zu erreichen?
FlavorScape
1
@FlavorScape Ich verwende Etc/UTC Es gibt auch bestimmte Offsets in Etc, aber der Offset ist umgekehrt zu dem, was man erwarten würde. Etc/GMT-1ist UTC + 1 Stunde. Siehehttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Npskirk
9
Stellen Sie die Server-Zeitzone ein und verwenden Sie die NTP-Synchronisierung. Hier ist eine bessere Lösung, um die Serverzeit zu ändern.
Zeitzonen auflisten
timedatectl list-timezones
Zeitzone einstellen
sudo timedatectl set-timezone America/New_York
Überprüfen Sie die Zeitzone
timedatectl
Ich bevorzuge die Verwendung der UTC-Zeitzone für meine Server und Datenbanken. Alle Konvertierungen müssen auf dem Client durchgeführt werden. Wir können moment.js auf Client-Seite nutzen.
Es wird auch einfach sein, viele Instanzen zu pflegen.
Während moment.js damals eine großartige Bibliothek war, gibt es derzeit weitaus kleinere Alternativen (z. B. date-fns ). Der Moment ist riesig ; Bitte empfehlen Sie es nicht für Client-Anwendungen.
Dan Dascalescu
5
Ich weiß, dass dieser Thread sehr alt ist, aber ich denke, das würde jedem helfen, der hier von Google gelandet ist, wie ich.
In GAE Flex (NodeJs) können Sie die Umgebungsvariable TZ (die alle Datums- und Zeitzonen in der App verwaltet) in der Datei app.yaml festlegen. Ich lasse Ihnen hier ein Beispiel:
Hier ist eine Antwort für diejenigen, die eine Node.js-Anwendung für Amazon AWS Elastic Beanstalk bereitstellen . Ich habe das nirgendwo anders dokumentiert gesehen:
Stellen Sie Configuration -> Software -> Environment Propertiesunter einfach das Schlüsselwertpaar TZund Ihre Zeitzone ein, z. B. America/Los Angeles, und übernehmen Sie die Änderung.
Sie können den Effekt überprüfen, indem Sie new Date().toString()in Ihrer Node-App ausgeben und auf das Zeitzonensuffix achten.
Ab Knoten 13 können Sie jetzt wiederholt festlegen process.env.TZ, dass dies in der Zeitzone neuer Datumsobjekte angezeigt wird. Ich weiß nicht, ob ich dies im Produktionscode verwenden würde, aber es wäre definitiv nützlich bei Unit-Tests.
> 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 ist ziemlich schwer für eine Aufgabe wie diese und ich würde es nicht empfehlen, es sei denn, das gewünschte Verhalten ist nicht durch Dateoder andere eingebaute Module möglich.
Chris Williamson
2
Manchmal führen Sie Code auf einem virtuellen Server an einer anderen Stelle aus. Dies kann beim Ausführen von NODEJS oder anderen Varianten schlammig werden.
Hier ist ein Fix, mit dem Sie jede Zeitzone einfach verwenden können.
Wie @Tom hervorhob, ist in Version 13 jetzt die vollständige ICU-Unterstützung integriert. So können die Einrichtungsschritte weggelassen werden. Sie können weiterhin anpassen, wie Sie icu zur Laufzeit erstellen oder verwenden möchten: https://nodejs.org/api/intl.html
Für node.js unter Windows können Sie Folgendes tun:
Installieren Sie full-icu, wenn es installiert wurde, wodurch Datumsschemas ordnungsgemäß angewendet werden
npm i full-icu
oder global: npm i -g full-icu
Verwenden Sie toLocaleString () in Ihrem Code, z.
new Date().toLocaleString('en-AU', { timeZone: 'Australia/Melbourne' })
Dies erzeugt so etwas wie : 25/02/2019, 3:19:22 pm. Wenn Sie 24 Stunden bevorzugen, produziert 'en-GB':25/02/2019, 15:19:22
Für node.js als Azure-Webanwendung müssen Sie zusätzlich zu den Anwendungseinstellungen von WEBSITE_TIME_ZONE auch NODE_ICU_DATA auf z. B. setzen, z. B. <your project>\node_modules\full-icunachdem Sie die npm i full-icu ausgeführt haben. Die globale Installation des Pakets in Azure wird nicht empfohlen, da dieses Verzeichnis nur vorübergehend ist und gelöscht werden kann.
Dies funktioniert unter Windows nicht. Sie können die TZ env var nicht auf diese Weise einstellen. Wenn Sie TZ einstellen, wird es nicht als Standardzeitzone des Knotens erkannt.
Nate
-1
Legen Sie einfach die Umgebungsvariable in Ihrer Hauptdatei wie index.js oder app.js oder main.js fest oder wie auch immer Ihr Dateiname lautet:
process.env.TZ ="Aisa/Tehran";
Dadurch wird die Zeitzone festgelegt, die in Ihrer gesamten Knotenanwendung verwendet wird
Antworten:
Gemäß diesem Google-Gruppenthread können Sie die TZ-Umgebungsvariable festlegen, bevor Sie Datumsfunktionen aufrufen. Einfach getestet und es funktioniert.
Sie können die Zeitzone jedoch später nicht mehr ändern, da Node die Umgebungsvariable bereits gelesen hat.
quelle
process.env.TZ = 'Europe/Amsterdam'
denke ich jedes Mal, wenn ich so etwas wie "schön, wo finde ich jetzt eine Liste aller gültigen Werte, die ich einstellen kann?" und ich finde es nicht jedes Mal.zone.tab
Datei in diesem Archiv.Ein anderer Ansatz, der zumindest in einer Linux-Umgebung für mich zu funktionieren schien, besteht darin, Ihre Node.js-Anwendung wie folgt auszuführen:
Dies sollte zumindest sicherstellen, dass die Zeitzone bereits von Anfang an richtig eingestellt ist.
quelle
Hier ist ein 100% funktionierendes Beispiel für das Abrufen einer benutzerdefinierten Zeitzone Datum Uhrzeit in NodeJs ohne Verwendung externer Module:
quelle
Leider funktioniert die Einstellung
process.env.TZ
nicht wirklich gut - im Grunde ist es unbestimmt, wann die Änderung wirksam wird.Das Einstellen der Zeitzone des Systems vor dem Starten des Knotens ist daher Ihre einzig richtige Option.
Wenn Sie dies jedoch nicht tun können, sollte es möglich sein, die Knotenzeit als Problemumgehung zu verwenden: Ermitteln Sie Ihre Zeiten in lokaler oder UTC-Zeit und konvertieren Sie sie in die gewünschte Zeitzone. Siehe Verwenden des Zeitzonenversatzes in Nodejs. für Details.
quelle
Die Lösung
env TZ='Europe/Amsterdam' node server.js
von @uhef funktioniert in Fällen, in denen Ihre App nicht mit einem Forked-Prozess funktioniert. Wenn Sie jedoch mit einem Forked-Prozess arbeiten, insbesondere wenn Sie Ihre App mit einem Build- Tool wie gulp starten ,gulp
übernimmt der Befehl die env-Werte der prozess von gulp nicht erstellt (deine app).Um dies zu lösen, müssen Sie Folgendes tun:
Dadurch wird die
TZ
Umgebungsvariable für alle Prozesse festgelegt, die in der Konsole gestartet werden, an der Sie arbeiten. Dazu gehören alle nach dem Befehl gulp ausgeführten Teilprozesse in derselben Konsole, ohne dass sie erneut mit dem Präfix ausgeführtexport TZ="Europe/Amsterdam";
werden müssen.quelle
Etc/UTC
Es gibt auch bestimmte Offsets inEtc
, aber der Offset ist umgekehrt zu dem, was man erwarten würde.Etc/GMT-1
ist UTC + 1 Stunde. Siehehttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Stellen Sie die Server-Zeitzone ein und verwenden Sie die NTP-Synchronisierung. Hier ist eine bessere Lösung, um die Serverzeit zu ändern.
Zeitzonen auflisten
Zeitzone einstellen
Überprüfen Sie die Zeitzone
Ich bevorzuge die Verwendung der UTC-Zeitzone für meine Server und Datenbanken. Alle Konvertierungen müssen auf dem Client durchgeführt werden. Wir können moment.js auf Client-Seite nutzen.
Es wird auch einfach sein, viele Instanzen zu pflegen.
quelle
Ich weiß, dass dieser Thread sehr alt ist, aber ich denke, das würde jedem helfen, der hier von Google gelandet ist, wie ich.
In GAE Flex (NodeJs) können Sie die Umgebungsvariable TZ (die alle Datums- und Zeitzonen in der App verwaltet) in der Datei app.yaml festlegen. Ich lasse Ihnen hier ein Beispiel:
app.yaml
quelle
Hier ist eine Antwort für diejenigen, die eine Node.js-Anwendung für Amazon AWS Elastic Beanstalk bereitstellen . Ich habe das nirgendwo anders dokumentiert gesehen:
Stellen Sie
Configuration -> Software -> Environment Properties
unter einfach das SchlüsselwertpaarTZ
und Ihre Zeitzone ein, z. B.America/Los Angeles
, und übernehmen Sie die Änderung.Sie können den Effekt überprüfen, indem Sie
new Date().toString()
in Ihrer Node-App ausgeben und auf das Zeitzonensuffix achten.quelle
Ab Knoten 13 können Sie jetzt wiederholt festlegen
process.env.TZ
, dass dies in der Zeitzone neuer Datumsobjekte angezeigt wird. Ich weiß nicht, ob ich dies im Produktionscode verwenden würde, aber es wäre definitiv nützlich bei Unit-Tests.quelle
set TZ='UTC' node index.js
Sie können Moment Zeitzone nehmen . Sie können Ihren Standort festlegen und sich um die Sommerzeit kümmern.
quelle
Date
oder andere eingebaute Module möglich.Manchmal führen Sie Code auf einem virtuellen Server an einer anderen Stelle aus. Dies kann beim Ausführen von NODEJS oder anderen Varianten schlammig werden.
Hier ist ein Fix, mit dem Sie jede Zeitzone einfach verwenden können.
Hier finden Sie eine Liste der Zeitzonen
Setzen Sie einfach Ihre Zeitzonenphrase in die Klammern Ihrer FORMAT-Zeile.
In diesem Fall konvertiere ich EPOCH zu Eastern.
quelle
Ich arbeite mit diesem npm Paket Unix-System-Zeitzone
quelle
Update für node.js v13
Wie @Tom hervorhob, ist in Version 13 jetzt die vollständige ICU-Unterstützung integriert. So können die Einrichtungsschritte weggelassen werden. Sie können weiterhin anpassen, wie Sie icu zur Laufzeit erstellen oder verwenden möchten: https://nodejs.org/api/intl.html
Für node.js unter Windows können Sie Folgendes tun:
Installieren Sie full-icu, wenn es installiert wurde, wodurch Datumsschemas ordnungsgemäß angewendet werden
npm i full-icu
oder global:npm i -g full-icu
Verwenden Sie toLocaleString () in Ihrem Code, z.
new Date().toLocaleString('en-AU', { timeZone: 'Australia/Melbourne' })
Dies erzeugt so etwas wie :
25/02/2019, 3:19:22 pm
. Wenn Sie 24 Stunden bevorzugen, produziert 'en-GB':25/02/2019, 15:19:22
Für node.js als Azure-Webanwendung müssen Sie zusätzlich zu den Anwendungseinstellungen von WEBSITE_TIME_ZONE auch NODE_ICU_DATA auf z. B. setzen, z. B.
<your project>\node_modules\full-icu
nachdem Sie die npm i full-icu ausgeführt haben. Die globale Installation des Pakets in Azure wird nicht empfohlen, da dieses Verzeichnis nur vorübergehend ist und gelöscht werden kann.Ref: 1. NodeJS wendet Datumsschemas nicht richtig an
quelle
Sie können die globale Zeitzone mit der Bibliothek tzdata konfigurieren:
Nachdem Sie Ihre Umgebung mit der Variablen festgelegt haben, zum Beispiel: TZ = America / Bogota
Und testen in Ihrem Projekt:
Ich hoffe dir zu helfen
quelle
Sie können die Prozesszeitzone von Node.js erzwingen, indem Sie die Umgebungsvariable
TZ
auf setzenUTC
Die gesamte Zeit wird also in UTC + 00: 00 gemessen
Vollständige Liste: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Beispiel package.json:
quelle
Legen Sie einfach die Umgebungsvariable in Ihrer Hauptdatei wie index.js oder app.js oder main.js fest oder wie auch immer Ihr Dateiname lautet:
Dadurch wird die Zeitzone festgelegt, die in Ihrer gesamten Knotenanwendung verwendet wird
quelle