sfondo
L' Date
oggetto JavaScript tiene traccia del tempo in UTC internamente, ma in genere accetta input e produce output nell'ora locale del computer su cui è in esecuzione. Ha pochissime strutture per lavorare con il tempo in altri fusi orari.
La rappresentazione interna di un Date
oggetto è un singolo numero, che rappresenta il numero di millisecondi trascorsi da allora 1970-01-01 00:00:00 UTC
, senza considerare i secondi bisestili. Non esiste alcun fuso orario o formato stringa memorizzato nell'oggetto Date stesso. Quando Date
vengono utilizzate varie funzioni dell'oggetto, il fuso orario locale del computer viene applicato alla rappresentazione interna. Se la funzione produce una stringa, è possibile prendere in considerazione le informazioni sulla locale del computer per determinare come produrre quella stringa. I dettagli variano in base alla funzione e alcuni sono specifici dell'implementazione.
Le uniche operazioni che l' Date
oggetto può fare con fusi orari non locali sono:
Può analizzare una stringa contenente un offset UTC numerico da qualsiasi fuso orario. Lo utilizza per regolare il valore analizzato e memorizza l'equivalente UTC. L'ora locale originale e l'offset non vengono mantenuti Date
nell'oggetto risultante . Per esempio:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
In ambienti che hanno implementato l' API di internazionalizzazione ECMASCript (aka "Intl"), un Date
oggetto può produrre una stringa specifica della locale adattata a un determinato identificatore di fuso orario. Ciò si ottiene tramite l' timeZone
opzione toLocaleString
e le sue variazioni. La maggior parte delle implementazioni supporterà gli identificatori di fuso orario IANA, come 'America/New_York'
. Per esempio:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
La maggior parte degli ambienti moderni supporta l'intero set di identificatori di fuso orario IANA ( vedere la tabella di compatibilità qui ). Tuttavia, tieni presente che l'unico identificativo richiesto per essere supportato da Intl è 'UTC'
, quindi dovresti controllare attentamente se è necessario supportare browser più vecchi o ambienti atipici (ad esempio, dispositivi IoT leggeri).
biblioteche
Esistono diverse librerie che possono essere utilizzate per lavorare con i fusi orari. Sebbene non riescano ancora a far Date
comportare diversamente l' oggetto, in genere implementano il database del fuso orario IANA standard e forniscono funzioni per utilizzarlo in JavaScript. Le librerie moderne utilizzano i dati del fuso orario forniti dall'API Intl, ma le librerie più vecchie in genere hanno un sovraccarico, soprattutto se si esegue in un browser Web, poiché il database può diventare un po 'grande. Alcune di queste librerie consentono anche di ridurre selettivamente il set di dati, in base al quale i fusi orari sono supportati e / o in base all'intervallo di date con cui è possibile lavorare.
Ecco le librerie da considerare:
Librerie basate su Intl
Il nuovo sviluppo dovrebbe scegliere tra una di queste implementazioni, che si basano sull'API Intl per i dati relativi al fuso orario:
Librerie non internazionali
Queste librerie sono mantenute, ma comportano l'onere di impacchettare i propri dati di fuso orario, che possono essere piuttosto grandi.
* Mentre Moment e Moment-Timezone erano stati precedentemente raccomandati, il team Moment ora preferisce che gli utenti abbiano scelto Luxon per un nuovo sviluppo.
Librerie fuori produzione
Queste librerie sono state ufficialmente interrotte e non dovrebbero più essere utilizzate.
Proposte future
La proposta temporale TC39 mira a fornire un nuovo set di oggetti standard per lavorare con date e orari nel linguaggio JavaScript stesso. Ciò includerà il supporto per un oggetto sensibile al fuso orario.