Wie kann ich die Standardzeitzone in node.js festlegen?


153

Wie lege ich die Standardzeitzone in node.js fest?


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

Sie können die Zeitzone jedoch später nicht mehr ändern, da Node die Umgebungsvariable bereits gelesen hat.


3
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.


Nett! Funktioniert für mich
Rotem

Können Sie dasselbe für Kulturen tun?
Jim Aho

Dies machte es viel einfacher, eine Zeitzone zu erzwingen, als dies im Code zu versuchen .
Dan Dascalescu

33

Hier ist ein 100% funktionierendes Beispiel für das Abrufen einer benutzerdefinierten Zeitzone Datum Uhrzeit in NodeJs ohne Verwendung externer Module:

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

console.log(nDate);


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).
Tom

31

Leider funktioniert die Einstellung process.env.TZnicht 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.


1
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.


2
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:

app.yaml

# [START env]
env_variables:
  # Timezone
  TZ: America/Argentina/Buenos_Aires

5

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.


3

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'
> (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
Dies funktioniert hervorragend unter Linux / Mac, aber nicht unter Windows.
Nate

Nein, es funktioniert auch für Windows. Verwenden Sieset TZ='UTC' node index.js
user3896501

@ user3896501 nein, diese Syntax legt die env var für den gesamten Prozess fest - nicht während der Ausführung wie im Beispiel des OP.
Ian Grainger

2

Sie können Moment Zeitzone nehmen . Sie können Ihren Standort festlegen und sich um die Sommerzeit kümmern.


2
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.

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.

//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

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:

  1. Installieren Sie full-icu, wenn es installiert wurde, wodurch Datumsschemas ordnungsgemäß angewendet werden

    npm i full-icu oder global: npm i -g full-icu

  2. 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.

Ref: 1. NodeJS wendet Datumsschemas nicht richtig an

  1. Sie können node.js auch mit intl-Optionen erstellen. Weitere Informationen finden Sie hier

1
full-icu ist in den Standard- / offiziellen Builds von Node ab Version 13 enthalten, sodass die oben genannten Schritte nicht mehr erforderlich sind.
Tom

1

Sie können die globale Zeitzone mit der Bibliothek tzdata konfigurieren:

npm install tzdata -y

Nachdem Sie Ihre Umgebung mit der Variablen festgelegt haben, zum Beispiel: TZ = America / Bogota

Und testen in Ihrem Projekt:

new Date()

Ich hoffe dir zu helfen


1

Sie können die Prozesszeitzone von Node.js erzwingen, indem Sie die Umgebungsvariable TZauf 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:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.