Moment.js se transforma en un objeto de fecha
Al usar Moment.js, no puedo transformar un objeto de momento correcto en un objeto de fecha con zonas horarias. No consigo la fecha correcta.
Ejemplo:
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())
Utilice esto para transformar un objeto de momento en un objeto de fecha:
Desde http://momentjs.com/docs/#/displaying/as-javascript-date/
moment().toDate();
Rendimientos:
Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
Siempre que haya inicializado la zona horaria momento con los datos de las zonas que desea , su código funciona como se esperaba.
Estás convirtiendo correctamente el momento a la zona horaria, lo que se refleja en la segunda línea de salida de momentObj.format()
.
Cambiar a UTC no solo elimina el desplazamiento, sino que vuelve a la zona horaria UTC. Si va a hacer eso, no necesita la .tz()
llamada original en absoluto. Podrías simplemente hacerlo moment.utc()
.
¿Quizás solo estás intentando cambiar la cadena de formato de salida? Si es así, simplemente especifique los parámetros que desea para el format
método:
momentObj.format("YYYY-MM-DD HH:mm:ss")
Con respecto a las últimas líneas de su código, cuando regresa a un Date
objeto usando toDate()
, está abandonando el comportamiento de moment.js y volviendo al comportamiento de JavaScript. Un objeto JavaScript Date
siempre se imprimirá en la zona horaria local de la computadora en la que se ejecuta. No hay nada que moment.js pueda hacer al respecto.
Un par de pequeñas cosas más:
Si bien por el momento el constructor puede tomar un
Date
, generalmente es mejor no usarlo. Para "ahora", no utilicesmoment(new Date())
. En su lugar, simplemente usemoment()
. Ambos funcionarán pero es innecesariamente redundante. Si está analizando una cadena, pase esa cadena directamente al momento. No intentes analizarlo porDate
primera vez. Descubrirá que el analizador de momentos es mucho más confiable.Las zonas horarias como
MST7MDT
están ahí por razones de compatibilidad con versiones anteriores. Provienen de zonas horarias de estilo POSIX y solo unas pocas de ellas están en los datos de TZDB. A menos que sea absolutamente necesario, debería utilizar una clave comoAmerica/Denver
.
.toDate
Realmente no funcionó para mí, así que esto es lo que hice:
futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))
espero que esto ayude
Como momentjs no tiene control sobre el objeto de fecha de JavaScript, encontré una solución alternativa a esto.
const currentTime = new Date();
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);
Esto le dará un objeto de fecha de JavaScript con la hora convertida.