Moment.js transformar en objeto de fecha


696

Usando Moment.js no puedo transformar un objeto de momento correcto en un objeto de fecha con zonas horarias. No puedo obtener 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())

1
¿Qué salida esperas y qué salida obtienes?
Felix Kling

44
4 filas consígame salida: <code> (objeto de fecha) Hora con desplazamiento jue 01 ago 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </code> Pero la zona horaria debe ser MST7MDT
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 am¿Es esto posible convertir 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya

Los objetos de fecha no tienen una zona horaria, son solo un desplazamiento de 1970-01-01T00: 00: 00Z. Entonces, cuando llama a toDate , el objeto devuelto ha perdido la información de zona horaria que adjuntó al objeto de momento .tz("MST7MDT"). Es por eso que existen bibliotecas como moment.tz, para complementar la capacidad básica del objeto Date incorporado que solo comprende UTC y la zona horaria del host, eso es todo.
RobG

Respuestas:


1235

Use 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)

11
@Spencer: Sí, responde el título y, de toDatehecho , es cómo obtener un Dateobjeto de a moment. Pero el código en el cuerpo de la pregunta pregunta sobre la conversión de zona horaria, que Dateno puede hacer. A menos que el tiempo de montaña sea la zona horaria del usuario, entonces no estoy seguro de cómo respondió esta pregunta.
Matt Johnson-Pint

1
@Matt solo depende de qué parte de la pregunta estás mirando. La mayoría de las personas busca en Google y ve que este título se alinea con su pregunta y vota la respuesta que responde al título, no el cuerpo de la pregunta. Eso podría explicar por qué esto tiene la mayor cantidad de votos a pesar de que técnicamente no ayuda al OP.
Spencer

14
¿Es esta realmente la respuesta correcta? La pregunta era cómo transformar el objeto de momento en una fecha de JavaScript pero con TIMEZONE. Todavía vuelve a la zona horaria local cuando se cambia al objeto de fecha de JavaScript.
Indecible

1
Hola chicos, revisen este enlace momentjs.com/guides/#/warnings/js-date . Esto se desaconseja y se eliminará en el próximo lanzamiento principal.
Gtzinos

3
@gtzinos a lo que se está vinculando y haciendo referencia es un tema y escenario separados, por ejemplo, pasar una cadena al constructor de momento moment("12/12/2011")es donde obtendría ese mensaje. No tiene nada que ver con ir de momento a momento objmoment().toDate()
btbJosh

51

Siempre que haya inicializado la zona horaria de momento con los datos de las zonas que desee , su código funciona como se esperaba.

Está convirtiendo correctamente el momento a la zona horaria, 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 cambiar a la zona horaria UTC. Si va a hacer eso, no necesita la .tz()llamada original en absoluto. Podrías simplemente hacer moment.utc().

¿Quizás solo está tratando de cambiar la cadena de formato de salida? Si es así, solo especifique los parámetros que desea para el formatmétodo:

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

Con respecto a las últimas líneas de su código: cuando regresa a un Dateobjeto usando toDate(), abandona el comportamiento de moment.js y vuelve al comportamiento de JavaScript. Un JavaScriptDate objeto siempre se imprimirá en la zona horaria local de la computadora en la que se está ejecutando. No hay nada moment.js puede hacer al respecto.

Un par de otras pequeñas cosas:

  • Si bien el momento en que el constructor puede tomar un Date, generalmente es mejor no usar uno. Para "ahora", no lo use moment(new Date()). En cambio, solo utilícelo moment(). Ambos funcionarán pero es innecesariamente redundante. Si está analizando desde una cadena, pase esa cadena directamente al momento. No intentes analizarlo por Dateprimera vez. Encontrará que el analizador de momentos es mucho más confiable.

  • Las zonas horarias como MST7MDTestán allí por razones de compatibilidad con versiones anteriores. Provienen de zonas horarias de estilo POSIX, y solo unos pocos están en los datos TZDB. A menos que sea absolutamente necesario, debe usar una clave como America/Denver.


Gracias Matt! Tu respuesta fue útil. Como mencionó sobre el uso de América / Denver en lugar de MST7MDT, ¿hay un mapa disponible para estas asignaciones? Estoy usando bastantes zonas horarias como CET, EET, EST5EDT, CST6CDT, PST8PDT.
monish001

¿es posible convertir, por ejemplo: "10:20 AM" (Tiempo de cadena obtenido desde el momento (). formato ('hh: mm A')) al objeto Fecha?
ram

2
@ram - 1) si tienes un momento, solo úsalo .toDate(). 2) No use comentarios para hacer nuevas preguntas. Para eso está el gran botón "Hacer pregunta" .
Matt Johnson-Pint

22

.toDate realmente no funcionó para mí, entonces, esto es lo que hice:

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

espero que esto ayude


2
Esta respuesta no responde la pregunta. El código es una forma de escritura larga y sin aliento moment().add(1, 'd').toDate().
RobG

12

Como momentjs no tiene control sobre el objeto de fecha de JavaScript, encontré una solución para 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 el tiempo convertido


2
Esta es la única respuesta correcta que responde directamente a la pregunta.
Anish Sana

1
Esto es exactamente lo que quería. Esperaba que las fechas nativas representaran las zonas horarias correctamente, pero lamentablemente me equivoqué.
mklbtz

1
Safari no admite el formato "AAAA-MM-DD HH: mm: ss", por lo que el resultado es nulo . El formato debe ser "AAAA-MM-DDTHH: mm: ss" (use un formato compatible con ECMAScript, una "T" entre las partes de fecha y hora).
RobG

4

Necesitaba tener información de zona horaria en mi cadena de fecha. Originalmente estaba usando, moment.tz(dateStr, 'America/New_York').toString();pero luego comencé a recibir errores sobre cómo volver a alimentar esa cadena en el momento.

Probé moment.tz(dateStr, 'America/New_York').toDate();pero luego perdí la información de zona horaria que necesitaba.

La única solución que devolvió una cadena de fecha utilizable con zona horaria que podría retroalimentarse en ese momento fuemoment.tz(dateStr, 'America/New_York').format();


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

¡¡¡¡bonito y limpio!!!!


Esta fue la única solución aquí en mi caso que funcionó para tener un formato utc. Gracias
Luis Febro

3

Para convertir cualquier fecha, por ejemplo, utc:

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

2
¡Esto realmente me salvó el día!
HV Sharma

Esta respuesta es incorrecta. Aplica el desplazamiento de la zona horaria dos veces: moment().utc()devuelve valores para UTC, luego .format( "YYYY-MM-DD HH:mm:ss" )devuelve una cadena que se ha establecido en UTC sin un desplazamiento de zona horaria, por lo que se analiza como local. No coincide con un formato de momento predeterminado, por lo que el analizador incorporado lo analiza. Tampoco coincide con ningún formato compatible con ECMAScript, por lo que el análisis depende de la implementación. De todos modos, se analiza como local, por lo que el desplazamiento de la zona horaria se aplica nuevamente al crear el valor de la fecha.
RobG

3

La pregunta es un poco oscura. Haré todo lo posible para explicar esto. Primero debes entender cómo usar momentzone . De acuerdo con esta respuesta aquí, TypeError: moment (). Tz no es una función , debe importar el momento desde el momento-zona horaria en lugar del momento predeterminado (por supuesto, ¡primero tendrá que instalar npm momento-zona horaria!). Por el bien de la claridad,

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

Ahora, para usar la función de zona horaria, use moment.tz ("date_string / moment ()", "time_zone") (visite https://momentjs.com/timezone/ para obtener más detalles). Esta función devolverá un objeto de momento con una zona horaria particular. Por el bien de la claridad,

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

Ahora, cuando intente convertir newYork (el objeto de momento) con toDate () (conversión de formato ISO 8601), obtendrá la hora de Greenwich, Reino Unido. Para obtener más detalles, consulte este artículo https://www.nhc.noaa.gov/aboututc.shtml , sobre UTC. Sin embargo, si solo desea que su hora local esté en este formato (hora de Nueva York, según este ejemplo), simplemente agregue el método .utc (verdadero) , con el argumento verdadero , a su objeto de momento. Por el bien de la claridad,

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

En resumen, moment.tz considera la zona horaria que especifica y compara su hora local con la hora en Greenwich para obtener un resultado. Espero que esto haya sido útil.


2

moment ha actualizado js lib a partir del 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

si tiene libertad para usar Angular5 +, mejor use la función datePipe allí que la función de zona horaria aquí. Tengo que usar moment.js porque mi proyecto se limita solo a Angular2.


1

probar (sin formatpaso)

new Date(moment())


new Date(moment())es equivalente a new Date(). La zona horaria solo se establece para d .
RobG
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.