Come posso impostare il fuso orario predefinito in node.js?


154

Come posso impostare il fuso orario predefinito in node.js?


2
Abbastanza sicuro che non puoi davvero farlo. Modifica le impostazioni del fuso orario del sistema.
thejh

1
thejh ha ragione, non puoi cambiare il fuso orario. Utilizzare una libreria temporale JS (come moment.js) e aggiungere / sottrarre invece ore.
alessioalex,

2
Il modo più semplice e corretto per farlo è semplicemente cambiare il fuso orario del tuo sistema.
Munim,

1
Questi sono commenti utili ma la maggior parte delle volte non sei il gestore del sistema;)
Mário de Sá Vera,

Risposte:


136

Secondo questo thread di gruppo di Google , è possibile impostare la variabile di ambiente TZ prima di chiamare qualsiasi funzione di data. L'ho appena testato e funziona.

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

Tuttavia, non è possibile modificare il fuso orario in un secondo momento, poiché da allora Node ha già letto la variabile di ambiente.


3
Interessante. La discussione sui bug suggerisce che c'è qualche problema con il threading. Ma l'esempio stava cambiando process.env.TZ più volte. Sembra impostarlo una volta all'inizio e lasciarlo da solo funziona. Grazie lorancou per il riferimento al nodo-tempo, tuttavia, per una gestione più flessibile e robusta.
webjprgm,

6
Purtroppo, non funziona in Windows. Funziona bene su mac os-x e unix
Ritesh Kumar Gupta,

15
Bella risposta. Sfortunatamente, ogni volta che vedo qualcosa di simile process.env.TZ = 'Europe/Amsterdam' penso "bello, ora dove posso trovare un elenco di tutti i valori validi che posso impostare?" e non lo trovo, ogni singola volta.
Rafael Eyng,

5
@RafaelEyng IANA (International Assigned Numbers Association) viene spesso utilizzato per fornire configurazioni aggiornate del fuso orario. Puoi trovare le ultime impostazioni del fuso orario qui: ftp.iana.org/tz/tzdata-latest.tar.gz Per una panoramica delle possibili stringhe del fuso orario controlla il zone.tabfile in quell'archivio.
JohannesB,

9
@RafaelEyng: come ha menzionato JohannesB iana.org/time-zones è la fonte ufficiale, ma il loro formato dei dati è difficile da lavorare. Trovo molto più facile lavorare da en.wikipedia.org/wiki/List_of_tz_database_time_zones , che è costruito dal set di dati IANA (attualmente la versione 2017c).
Peter Rust,

66

Un altro approccio che sembrava funzionare per me almeno in ambiente Linux è quello di eseguire l'applicazione Node.js in questo modo:

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

Ciò dovrebbe almeno garantire che il fuso orario sia impostato correttamente già dall'inizio.


Bello! Funziona per me
Rotem

Puoi fare lo stesso per le culture?
Jim Aho,

Ciò ha reso più semplice forzare un fuso orario, piuttosto che provare a farlo nel codice .
Dan Dascalescu,

33

Ecco un esempio funzionante al 100% per ottenere la data e l'ora personalizzate del fuso orario in NodeJs senza utilizzare moduli esterni:

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

console.log(nDate);


Sono perplesso - questo è molto votato ma ha un problema critico IMO. Le versioni dei nodi <13 hanno solo dati locali per 'en-us', il che significa che genera (in alcuni casi) o fornisce un formato di data errato per ogni altro paese. E in molti casi la data apparirà corretta ma il giorno e il mese vengono scambiati! E il Nodo 13 è stato appena rilasciato poche settimane fa, quindi questo problema si applica praticamente a tutti.
Tom,

Vedo che la risposta di @Marshall di seguito suggerisce un modo per risolverlo in alcune situazioni (non funzionerà in Lambda e altre FaaS).
Tom,

31

Sfortunatamente, l' impostazione process.env.TZnon funziona molto bene - in pratica è indeterminato quando la modifica sarà effettiva).

Quindi impostare il fuso orario del sistema prima di avviare il nodo è l'unica opzione corretta.

Tuttavia, se non riesci a farlo, dovrebbe essere possibile utilizzare nodo-orario come soluzione alternativa: ottenere i tuoi orari in ora locale o UTC e convertirli nel fuso orario desiderato. Vedi Come utilizzare la differenza di fuso orario in Nodejs? per dettagli.


1
Il tempo del modulo npm ha funzionato perfettamente per me. ho impostato su utc, quindi ho impostato tutte le volte usando utc, quindi il codice è portatile tra macchine diverse con fusi orari diversi.
Mark Shust alla M.academy il

Non ci sono più problemi con questo, vero?
Bloke,

16

La soluzione env TZ='Europe/Amsterdam' node server.jsdi @uhef funziona nei casi in cui la tua app non funziona con il processo biforcato, ma quando lavori con il processo biforcato, specialmente quando avvii la tua app con uno strumento di costruzione come gulp , il comando gulpprenderà i valori env, ma il processo creato da gulp non (la tua app).

Per risolvere questo, devi fare:

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

Questo imposterà la TZvariabile d'ambiente per tutto il processo avviato nella console su cui stai lavorando, inclusi tutti i processi successivi eseguiti dopo il comando gulp nella stessa console senza la necessità di eseguirli export TZ="Europe/Amsterdam";nuovamente con il prefisso .


dal momento che Amsterdam ha l'ora legale, è ancora questo il tz desiderabile per raggiungere "mezzanotte UTC" al GMT +1?
FlavorScape

1
@FlavorScape I use Etc/UTC Ci sono anche offset specifici disponibili in Etc, ma l'offset è al contrario di quanto ci si aspetterebbe. Etc/GMT-1è UTC + 1 ora. Vedihttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk,

9

Imposta il fuso orario del server e usa la sincronizzazione NTP. Ecco una soluzione migliore per cambiare l'ora del server.

Per elencare i fusi orari

timedatectl list-timezones

Per impostare il fuso orario

sudo timedatectl set-timezone America/New_York

Verifica fuso orario

timedatectl

Preferisco usare il fuso orario UTC per i miei server e database. Qualsiasi conversione deve essere gestita sul client. Possiamo usare moment.js sul lato client.

Sarà facile mantenere anche molti casi,


2
Mentre moment.js era una grande biblioteca nel passato, al momento ci sono alternative molto più piccole (ad esempio date-fns ). Il momento è enorme ; per favore non lo consiglio per le applicazioni client.
Dan Dascalescu,

5

So che questa discussione è molto vecchia, ma penso che questo aiuterebbe chiunque sia arrivato qui da Google come me.

In GAE Flex (NodeJs), puoi impostare la variabile ambientale TZ (quella che gestisce tutti i fusi orari nell'app) nel file app.yaml, ti lascio qui un esempio:

app.yaml

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

5

Ecco una risposta per coloro che implementano un'applicazione Node.js su Amazon AWS Elastic Beanstalk . Non l'ho visto documentato altrove:

Sotto Configuration -> Software -> Environment Properties, imposta semplicemente la coppia di valori-chiave TZe il tuo fuso orario America/Los Angeles, ad esempio , e Applica la modifica.

È possibile verificare l'effetto emettendo new Date().toString()l'app Node e prestando attenzione al suffisso del fuso orario.


3

A partire dal Nodo 13 , ora puoi impostare più volte process.env.TZe si rifletterà nel fuso orario dei nuovi oggetti Data. Non so se lo userei nel codice di produzione, ma sarebbe sicuramente utile nei test unitari.

> 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
Funziona benissimo su Linux / Mac, ma non funziona su Windows.
Nate

No, funziona anche con Windows, usaset TZ='UTC' node index.js
user3896501 il

@ user3896501 no, quella sintassi imposta env var per l'intero processo, non durante l'esecuzione come nell'esempio del PO.
Ian Grainger,

2

Puoi prendere il fuso orario del momento . Ti consente di impostare la tua posizione e si occupa anche dell'ora legale.


2
momento è piuttosto pesante per un compito come questo e non lo consiglierei a meno che il comportamento desiderato non sia possibile attraverso Dateo altri moduli integrati.
Chris Williamson,

2

A volte potresti eseguire codice su un server virtuale altrove - Ciò può diventare confuso quando esegui NODEJS o altri sapori.

Ecco una correzione che ti permetterà di usare facilmente qualsiasi fuso orario.

Controlla qui per l'elenco dei fusi orari

Inserisci la frase del fuso orario tra le parentesi della riga FORMATO.

In questo caso, sto convertendo EPOCH in orientale.

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

Aggiornamento per node.js v13

Come sottolineato da @Tom, il supporto completo per icu è ora integrato in v13. Quindi i passaggi di installazione possono essere omessi. Puoi comunque personalizzare il modo in cui vuoi creare o usare icu in runtime: https://nodejs.org/api/intl.html

Per node.js su Windows , è possibile effettuare le seguenti operazioni:

  1. Installa full-icu se è stato installato, che applica correttamente le date locali

    npm i full-icu o globalmente: npm i -g full-icu

  2. Usa toLocaleString () nel tuo codice, ad esempio:

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

    Questo produrrà qualcosa come: 25/02/2019, 3:19:22 pm. Se preferisci 24 ore, "en-GB" produrrà:25/02/2019, 15:19:22

Per node.js come app Web di Azure , oltre alle impostazioni dell'applicazione di WEBSITE_TIME_ZONE, devi anche impostare NODE_ICU_DATA su ad esempio <your project>\node_modules\full-icu, ovviamente dopo aver eseguito npm i full-icu. L'installazione globale del pacchetto in Azure non è consigliata in quanto tale directory è temporanea e può essere cancellata.

Rif: 1. NodeJS non applica correttamente le date locali

  1. Puoi anche creare node.js con opzioni intl, maggiori informazioni qui

1
full-icu è incluso nelle build standard / ufficiali di Node a partire dalla v13, quindi i passaggi precedenti non saranno più necessari.
Tom,

1

Puoi configurare il fuso orario globale con la libreria tzdata:

npm install tzdata -y

Dopo aver impostato il tuo ambiente con la variabile, ad esempio: TZ = America / Bogota

E test nel tuo progetto:

new Date()

Spero che tu possa aiutarti


1

È possibile applicare il fuso orario del processo Node.js impostando la variabile di ambiente TZsuUTC

Quindi tutto il tempo sarà misurato in UTC + 00: 00

Elenco completo: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Esempio package.json:

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

Questo non funziona su Windows. Non è possibile impostare TZ env var in questo modo. E se imposti TZ, non verrà riconosciuto come fuso orario predefinito del nodo.
Nate

-1

basta impostare la variabile di ambiente nel file principale come index.js o app.js o main.js o qualunque sia il nome del file:

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

questo imposterà il fuso orario che verrà utilizzato nell'intera applicazione del nodo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.