Moment: Confusión sobre moment.utz con MySQL DateTime

Creado en 18 abr. 2016  ·  3Comentarios  ·  Fuente: moment/moment

He escrito una pequeña prueba aquí: https://jsfiddle.net/vrdhcuey/1/

Cuando solicitamos de la base de datos, obtenemos un DATETIME de la base de datos MySQL (inicialmente configurado en la zona horaria UTC predeterminada, pero también probado con Europa / Dublín como zona horaria) de 2016-04-22T16:00:00.000Z , es decir, la fecha y hora de finalización de nuestro objeto es el viernes 22 de abril, a las 16 h. En realidad, esto no tiene zona horaria, ya que todo lo que decimos es que el evento puede terminar a las 4 p.m. en una fecha determinada, pero esa fecha podría caer en GMT o BST.

En la prueba proporcionada, queremos obtener la duración entre ahora y esa fecha y hora. Sin embargo, siempre queda una hora de descanso. La única forma de evitarlo es eliminar .000Z del final de la cadena de fecha y hora. También intenté usar moment.tz pero obtuve el mismo resultado (es decir, en esta prueba, leftTime4 es el comportamiento correcto que esperamos). Sin embargo, habría esperado que leftTime2 funcionara como está.

¿Alguien puede aclarar esta confusión o estoy encontrando un error aquí?

Comentario más útil

El estándar ISO8601 especifica que las fechas que terminan en Z se interpretarán como UTC. Como tal, lo que hace cuando pasa su tiempo es convertir el tiempo de UTC a local. Así es como obtienes tu situación de una hora libre.

Si desea por un momento ignorar la Z (interpretar la hora como local), puede especificar un formato que no recoja la Z haciendo lo siguiente:

moment('2016-04-22T16:00:00.000Z', 'YYYY-MM-DDTHH:mm:ss.SSS').format()

Si desea obtener más información sobre los distintos modos de análisis, esta sección de las guías puede ser útil: http://momentjs.com/guides/#/parsing/local -utc-zone /

Todos 3 comentarios

El estándar ISO8601 especifica que las fechas que terminan en Z se interpretarán como UTC. Como tal, lo que hace cuando pasa su tiempo es convertir el tiempo de UTC a local. Así es como obtienes tu situación de una hora libre.

Si desea por un momento ignorar la Z (interpretar la hora como local), puede especificar un formato que no recoja la Z haciendo lo siguiente:

moment('2016-04-22T16:00:00.000Z', 'YYYY-MM-DDTHH:mm:ss.SSS').format()

Si desea obtener más información sobre los distintos modos de análisis, esta sección de las guías puede ser útil: http://momentjs.com/guides/#/parsing/local -utc-zone /

Correcto, entonces, la solución real es, no emitas Z desde tu back-end si realmente no te refieres a UTC.

@ mj1856 Sí, lo intenté, pero me pregunto si el problema radica en Sequlize en lugar de MySQL en sí mismo: cuando ejecutamos la consulta contra la base de datos directamente, emite solo un DATETIME simple con YYYY-MM-DD HH: MM: SS, ya que está almacenado . Cambiar la zona horaria de la base de datos parecía no hacer ninguna diferencia. De todos modos, lo anterior parece solucionarlo por ahora, veremos si se mantiene cuando regresemos a GMT: bomba:

¿Fue útil esta página
0 / 5 - 0 calificaciones