Usando Moment.js non riesco a trasformare un oggetto momento corretto in un oggetto data con fusi orari. Non posso ottenere la data corretta.
Esempio:
var oldDate = new Date(),
momentObj = moment(oldDate).tz("MST7MDT"),
newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())
Usatelo per trasformare un oggetto momento in un oggetto data:
Da http://momentjs.com/docs/#/displaying/as-javascript-date/
moment().toDate();
Rese:
Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
Finché avete inizializzato moment-timezone con i dati per le zone che volete, il vostro codice funziona come previsto.
Stai convertendo correttamente il momento nel fuso orario, il che si riflette nella seconda linea di output di momentObj.format()
.
Passare a UTC non fa semplicemente cadere l'offset, cambia di nuovo al fuso orario UTC. Se hai intenzione di farlo, non hai affatto bisogno della chiamata originale .tz()
. Puoi semplicemente fare moment.utc()
.
Forse stai solo cercando di cambiare la stringa del formato di output? Se è così, basta specificare i parametri che vuoi al metodo format
:
momentObj.format("YYYY-MM-DD HH:mm:ss")
Per quanto riguarda le ultime righe del tuo codice - quando torni a un oggetto Date
usando toDate()
, stai rinunciando al comportamento di moment.js e torni al comportamento di JavaScript. Un oggetto JavaScript Date
sarà sempre stampato nel fuso orario locale del computer su cui viene eseguito. Non c'è niente che moment.js possa fare al riguardo.
Un paio di altre piccole cose:
Mentre il costruttore di moment può prendere un Date
, di solito è meglio non usarlo. Per "now", non usare moment(new Date())
. Invece, usate semplicemente momento()
. Entrambi funzioneranno, ma è inutilmente ridondante. Se stai analizzando da una stringa, passa quella stringa direttamente a moment. Non cercare di analizzarla prima in un Date
. Troverai che il parser di moment è molto più affidabile.
I fusi orari come MST7MDT
sono lì per ragioni di compatibilità all'indietro. Derivano dai fusi orari in stile POSIX, e solo alcuni di essi sono presenti nei dati del TZDB. A meno che non sia assolutamente necessario, dovresti usare una chiave come America/Denver
.
.toDate
non ha davvero funzionato per me, quindi, ecco cosa ho fatto:
futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))
Spero che questo aiuti