2013-08-01 14 views
372

Uso di Moment.js Non riesco a trasformare un oggetto momento corretto in un oggetto data con fusi orari. Non riesco a ottenere la data corretta.Moment.js transform to to date object

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()) 
+1

Che cosa si aspetta l'uscita e che l'uscita si ottiene? –

+2

4 righe mi danno in output: (Date object) Time with offset Thu Aug 01 2013 15:23:49 GMT+0300 (Финляндия (лето)) Ma il fuso orario deve essere MST7MDT –

risposta

690

Utilizzare questo per trasformare un oggetto momento in un oggetto Data:

Da http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate(); 

rendimenti:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST) 
+2

@Spencer - Sì, risponde al titolo e 'toDate' è in effetti come ottenere un oggetto' Date' da un 'momento'. Ma il codice nel corpo della domanda chiede la conversione del fuso orario - che 'Date' non può fare. A meno che il tempo di Mountain non sia effettivamente il fuso orario dell'utente, non sono sicuro di come questo abbia risposto alla domanda. –

+1

@Matt dipende solo da quale parte della domanda stai guardando. La maggior parte delle persone cerca su google e vede che questo titolo si allinea con la loro domanda e modifica la risposta che risponde al titolo, non il corpo della domanda. Questo potrebbe spiegare perché questo ha il più upvotes anche se tecnicamente non aiuta l'OP. – Spencer

+6

Questa è effettivamente la risposta corretta? La domanda era come trasformare l'oggetto momento in una data javascript ma con TIMEZONE. Ritorna ancora al fuso orario locale quando si passa all'oggetto data javascript. – Unspeakable

30

Finché si è inizializzato moment-timezone con the data for the zones you want, il codice funziona come previsto.

Si sta convertendo correttamente l'ora nel fuso orario, che si riflette nella seconda riga di output da momentObj.format().

Passare a UTC non solo rilascia l'offset, ma torna al fuso orario UTC. Se hai intenzione di farlo, non hai affatto bisogno della chiamata originale .tz(). Potresti semplicemente fare moment.utc().

Forse stai solo provando a cambiare la stringa del formato di uscita? Se è così, basta specificare i parametri desiderati al metodo format:

momentObj.format("YYYY-MM-DD HH:mm:ss") 

Per quanto riguarda l'ultima alle linee del codice - quando si torna a un oggetto Date utilizzando toDate(), si stanno dando il comportamento del momento. js e tornare al comportamento di JavaScript. Un oggetto JavaScript Date verrà sempre stampato nel fuso orario locale del computer su cui è in esecuzione. Non c'è niente di moment.js può fare al riguardo.

Un paio di altre piccole cose:

  • Mentre il momento costruttore può prendere un Date, di solito è meglio non usare uno. Per "ora", non utilizzare moment(new Date()). Invece, basta usare moment(). Entrambi funzioneranno ma è inutilmente ridondante. Se stai analizzando da una stringa, passa quella stringa direttamente nel momento. Non provare prima ad analizzarlo su un Date. Troverai che il parser del momento è molto più affidabile.

  • Fusi orari come MST7MDT esistono per motivi di compatibilità con le versioni precedenti. Derivano dai fusi orari di stile POSIX e solo alcuni di essi si trovano nei dati TZDB. A meno che non sia assolutamente necessario, è necessario utilizzare una chiave come America/Denver.

+0

Grazie Matt! La tua risposta è stata utile. Come hai menzionato sull'utilizzo di America/Denver invece di MST7MDT, esiste una mappa disponibile per questi mapping? Sto usando alcuni di questi timezone come CET, EET, EST5EDT, CST6CDT, PST8PDT. – Monish

+2

http://wikipedia.org/wiki/List_of_tz_database_time_zones –

+0

è possibile convertire ad esempio: "10:20 AM" (Ottenuto il tempo della stringa dal formato momento(). ('Hh: mm A')) all'oggetto Data ?? – ram

12

.toDate in realtà non funziona per me, così , Ecco cosa ho fatto:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM")) 

speranza che questo aiuta

3

avevo bisogno di avere informazioni fuso orario nella mia stringa data.Inizialmente utilizzavo moment.tz(dateStr, 'America/New_York').toString(); ma poi ho iniziato a ricevere errori sull'alimentazione di quella stringa in un momento.

Ho provato il moment.tz(dateStr, 'America/New_York').toDate(); ma poi ho perso le informazioni sul fuso orario di cui avevo bisogno.

L'unica soluzione che ha restituito una stringa di data utilizzabile con fuso orario che potrebbe essere immessa nella momento era moment.tz(dateStr, 'America/New_York').format();