Moment.js si trasforma in oggetto data


696

Usando Moment.js non riesco a trasformare un oggetto momento corretto in un oggetto data con fusi orari. Non riesco a 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())

1
Quale output ti aspetti e quale output ottieni?
Felix Kling

4
4 righe get me so output: <code> (oggetto Date) Time with offset Gio 01 ago 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </code> Ma il fuso orario deve essere MST7MDT
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amè possibile convertirlo in 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya

Gli oggetti data non hanno un fuso orario, sono solo uno scostamento rispetto al 1970-01-01T00: 00: 00Z. Pertanto, quando si chiama toDate , l'oggetto restituito ha perso le informazioni sul fuso orario associate all'oggetto moment con .tz("MST7MDT"). Ecco perché esistono librerie come moment.tz, per integrare la funzionalità bare bones dell'oggetto Date incorporato che comprende solo UTC e il fuso orario dell'host, tutto qui.
RobG

Risposte:


1235

Usa questo per trasformare un oggetto momento in un oggetto data:

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

moment().toDate();

I rendimenti:

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

11
@Spencer - Sì, risponde al titolo ed toDateè davvero come ottenere un Dateoggetto da a moment. Ma il codice nel corpo della domanda chiede la conversione del fuso orario, il che Datenon può essere fatto. A meno che l'ora della montagna non sia effettivamente il fuso orario dell'utente, non sono sicuro di come abbia risposto alla domanda.
Matt Johnson-Pint,

1
@Matt dipende solo da quale parte della domanda stai guardando. La maggior parte delle persone cerca su Google e vede che questo titolo è in linea con la propria domanda e vota la risposta che risponde al titolo, non al corpo della domanda. Ciò potrebbe spiegare perché questo ha il maggior numero di voti, anche se tecnicamente non aiuta l'OP.
Spencer,

14
Questa è davvero la risposta corretta? La domanda era come trasformare l'oggetto momento in una data javascript ma con TIMEZONE. Torna ancora al fuso orario locale quando passa all'oggetto data javascript.
Indicibile

1
Ehi ragazzi, controllate questo link momentjs.com/guides/#/warnings/js-date . Questo è scoraggiato e verrà rimosso nella prossima versione principale.
gtzinos,

3
@gtzinos quello a cui stai collegando e a cui ti riferisci è un problema e uno scenario separati, ad esempio passare una stringa nel costruttore del momento moment("12/12/2011")è dove riceveresti quel messaggio. Non ha nulla a che fare con il passare da un momento all'altro objmoment().toDate()
bjJJosh

51

Finché hai inizializzato il fuso orario momento con i dati per le zone desiderate , il codice funziona come previsto.

Stai convertendo correttamente il momento nel fuso orario, che si riflette nella seconda riga dell'output da momentObj.format().

Il passaggio a UTC non si limita a eliminare l'offset, ma torna al fuso orario UTC. Se hai intenzione di farlo, non hai assolutamente bisogno della .tz()chiamata originale . Potresti semplicemente fare moment.utc().

Forse stai solo cercando di cambiare la stringa del formato di output? In tal caso, basta specificare i parametri che si desidera per il formatmetodo:

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

Per quanto riguarda le ultime righe del tuo codice: quando torni a un Dateoggetto usando toDate(), stai abbandonando il comportamento di moment.js e tornando al comportamento di JavaScript. Un Dateoggetto JavaScript verrà sempre stampato nel fuso orario locale del computer su cui è in esecuzione. Non c'è niente moment.js può fare al riguardo.

Un paio di altre piccole cose:

  • Mentre il costruttore del momento può prendere un Date, di solito è meglio non usarne uno. Per "ora", non usare 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 tentare di analizzarlo per Dateprimo. Troverai il parser del momento molto più affidabile.

  • Fusi orari come MST7MDTsono lì per motivi di compatibilità all'indietro. Derivano da fusi orari in 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.


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

è possibile convertire ad esempio: "10:20 AM" (Tempo stringa ottenuto da moment (). formato ('hh: mm A')) in oggetto Date ??
ram

2
@ram - 1) se hai un momento, basta usare .toDate(). 2) Non utilizzare i commenti per porre nuove domande. Ecco a cosa serve il grande pulsante "Fai domanda" .
Matt Johnson-Pint,

22

.toDate non ha funzionato davvero per me, quindi, ecco cosa ho fatto:

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

spero che sia di aiuto


2
Questa risposta non risponde alla domanda. Il codice è un modo prolisso di scrivere moment().add(1, 'd').toDate().
RobG

12

Dato che momentjs non ha alcun controllo sull'oggetto data javascript, ho trovato un modo per aggirare questo.

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

Questo ti darà un oggetto data javascript con l'ora convertita


2
Questa è l'unica risposta corretta che risponde direttamente alla domanda.
Anish Sana,

1
Questo è esattamente quello che volevo. Mi aspettavo che le date native rappresentassero correttamente i fusi orari, ma purtroppo mi sbagliavo.
mklbtz,

1
Il formato "AAAA-MM-GG HH: mm: ss" non è supportato da Safari, quindi il risultato è nullo . Il formato deve essere "AAAA-MM-GGTHH: mm: ss" (utilizzare un formato supportato da ECMAScript, una "T" tra le parti di data e ora).
RobG

4

Avevo bisogno di avere informazioni sul fuso orario nella mia stringa della data. Inizialmente stavo usando moment.tz(dateStr, 'America/New_York').toString();ma poi ho iniziato a ricevere errori nel reinserire quella stringa nel momento.

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

L'unica soluzione che restituiva una stringa di data utilizzabile con fuso orario che poteva essere ricondotta al momento eramoment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

bello e pulito !!!!


Questa è stata l'unica soluzione qui nel mio caso che ha funzionato per avere un formato utc. Grazie
Luis Febro il

3

Per convertire qualsiasi data, ad esempio utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
Questo mi ha davvero salvato la giornata!
HV Sharma,

Questa risposta è sbagliata Applica due volte lo scostamento del fuso orario: moment().utc()restituisce valori per UTC, quindi .format( "YYYY-MM-DD HH:mm:ss" )restituisce una stringa che è stata impostata su UTC senza uno scostamento del fuso orario, quindi viene analizzata come locale. Non corrisponde a un formato momento predefinito, quindi viene analizzato dal parser incorporato. Non corrisponde a nessun formato supportato da ECMAScript, quindi l'analisi dipende dall'implementazione. Ad ogni modo, viene analizzato come locale, quindi l'offset del fuso orario viene nuovamente applicato durante la creazione del valore dell'ora della data.
RobG

3

La domanda è un po 'oscura. Farò del mio meglio per spiegare questo. Per prima cosa dovresti capire come usare il fuso orario del momento . Secondo questa risposta qui TypeError: moment (). Tz non è una funzione , devi importare il momento dal momento-fuso orario invece del momento predefinito (ovviamente dovrai prima installare npm momento-fuso orario!). Per motivi di chiarezza,

const moment=require('moment-timezone')//import from moment-timezone

Ora, al fine di utilizzare la funzione fuso orario, utilizzare moment.tz ("date_string / moment ()", "time_zone") (visitare https://momentjs.com/timezone/ per maggiori dettagli). Questa funzione restituirà un oggetto momento con un particolare fuso orario. Per motivi di chiarezza,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

Ora quando provi a convertire newYork (l'oggetto moment) con moment's toDate () (conversione del formato ISO 8601) otterrai l'ora di Greenwich, Regno Unito. Per maggiori dettagli, consulta questo articolo https://www.nhc.noaa.gov/aboututc.shtml , su UTC. Tuttavia, se vuoi solo l'ora locale in questo formato (ora di New York, secondo questo esempio), aggiungi il metodo .utc (true) , con arg true , al tuo oggetto moment. Per motivi di chiarezza,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

In breve, moment.tz considera il fuso orario specificato e confronta l'ora locale con l'ora di Greenwich per ottenere un risultato. Spero sia stato utile.


2

moment ha aggiornato la js lib dal 06/2018.

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

se hai la libertà di usare Angular5 +, allora meglio usare la funzione datePipe qui che la funzione del fuso orario qui. Devo usare moment.js perché il mio progetto si limita solo ad Angular2.


1

prova (senza formatpassaggio)

new Date(moment())


new Date(moment())è equivalente a new Date(). Il fuso orario è impostato solo per d .
RobG
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.