Moment.js: data del formato in un fuso orario specifico

Sto usando Moment.js per analizzare e formattare le date nella mia app web. Come parte di un object JSON, il mio server di backend invia le date come un numero di millisecondi dall’epoca UTC (offset Unix).

Le date di analisi in un fuso orario specifico sono semplici: basta aggiungere l’identificatore del fuso orario RFC 822 alla fine della stringa prima di analizzare:

// response varies according to your timezone moment('3/11/2012 13:00').utc().format("MM/DD HH:mm") // problem solved, always "03/11 17:00" moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm") 

Ma come posso formattare una data in un fuso orario specifico ? Voglio risultati coerenti indipendentemente dall’ora corrente del browser, ma non voglio visualizzare le date in UTC.

Come sottolineato nella risposta di Manto , .utcOffset() è il metodo preferito dal momento 2.9.0. Questa funzione utilizza l’offset reale da UTC, non l’offset inverso (ad esempio, -240 per New York durante l’ora legale). Le stringhe di offset come “+0400” funzionano come prima:

 // always "2013-05-23 00:55" moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm') moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm') 

Il precedente .zone() come setter è stato deprecato in Moment.js 2.9.0. Ha accettato una stringa contenente un identificatore del fuso orario (ad esempio “-0400” o “-04: 00” per -4 ore) o un numero che rappresenta i minuti dietro UTC (ad esempio, 240 per New York durante l’ora legale).

 // always "2013-05-23 00:55" moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm') moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm') 

Per lavorare con i fusi orari denominati anziché gli offset numerici, includere Moment Timezone e utilizzare .tz() invece:

 // determines the correct offset for America/Phoenix at the given moment // always "2013-05-22 16:55" moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm') 

Usa il fuso orario

 moment(date).tz('Europe/Berlin').format(format) 

Prima di poter accedere a un determinato fuso orario, è necessario caricarlo in questo modo (o utilizzare metodi alternativi descritti qui )

 moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30') 

.zone () è stato deprecato, e dovresti usare utcOffset invece:

 // for a timezone that is +7 UTC hours moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm') 

Stavo avendo lo stesso problema con Moment.js. Ho installato il fuso orario, ma il problema non è stato risolto. Poi, ho fatto solo ciò che è esposto, imposta il fuso orario e funziona come un incantesimo:

 moment(new Date({your_date})).zone("+08:00") 

Molte grazie!

È appena arrivato questo, e visto che ho avuto lo stesso problema, avrei appena pubblicato i risultati che ho trovato

durante l’analisi, è ansible aggiornare lo scostamento (ovvero sto analizzando un dato (1.1.2014) e desidero solo la data, 1 ° gennaio 2014. Su GMT + 1 otterrei il 31.12.2013. Quindi ho prima bilanciato il valore.

 moment(moment.utc('1.1.2014').format()); 

Bene, mi è stato utile per supportare i vari fusi orari

B

Un paio di risposte già menzionano che il fuso orario è la strada da percorrere con il fuso orario denominato. Voglio solo chiarire qualcosa su questa libreria che mi ha molto confuso. C’è una differenza tra queste due affermazioni:

 moment.tz(date, format, timezone) moment(date, format).tz(timezone) 

Supponendo che un fuso orario non sia specificato nella data passata in:

Il primo codice prende la data e presuppone che sia passato il fuso orario. Il secondo prenderà una data, assumerà il fuso orario dal browser e quindi cambierà il fuso orario e il fuso orario in base al fuso orario passato.

Esempio:

 moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z" moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z" 

Il mio fuso orario è +5 da utc. Quindi nel primo caso non cambia e imposta la data e l’ora per avere il fuso orario utc.

Nel secondo caso, si presuppone che la data passata sia in -5, quindi la trasformi in UTC, ed è per questo che sputa la data “2018-07-18T00: 00: 00Z”

NOTA: il parametro di formato è molto importante. Se il momento omesso potrebbe ricadere nella class Date che può comportare comportamenti imprevedibili


Supponendo che il fuso orario sia specificato nella data passata in:

In questo caso si comportano entrambi allo stesso modo


Anche se ora capisco perché funziona in questo modo, ho pensato che fosse una caratteristica piuttosto confusa e meritevole di essere spiegata.

Puoi provare questo,

Qui puoi ottenere la data in base al fuso orario del client (browser).

 moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss') 

L’espressione regolare ti dà fondamentalmente il valore di offset.

Saluti!!