Moment: ¿Es posible mantener la zona horaria del backend?

Creado en 4 oct. 2018  ·  3Comentarios  ·  Fuente: moment/moment

Descripción del problema y pasos para reproducir:
Digamos que recibí una fecha del backend en este formato:

"2018-10-10T13:00:00+11:00"

Lo que espero ver en la interfaz después de analizar y formatear:

10-10-2018 1.00 PM

Lo que obtuve:

10-10-2018 5.00 AM

No me importa cuál es la zona horaria de mi sistema. Tampoco quiero ver la hora UTC. ¿Cómo puedo lograrlo?

Incluya los valores de todas las variables utilizadas.

Véase más arriba.

Ambiente:

No importa, no debería depender del entorno. Ese es el problema, por cierto, ¡porque depende!

Comentario más útil

Podrías probar parseZone :

por ejemplo, para una zona horaria local en BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"

Todos 3 comentarios

Afaik, el momento predeterminado es usar la zona horaria del dispositivo al formatear una fecha (que también es el comportamiento estándar de Javascript). Entonces sí, formatear una fecha debe depender del entorno. Por ejemplo, en mi dispositivo obtengo esto para su fecha, que es la hora correcta para mi hora local (Auckland):

moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'

Si desea establecer una zona horaria predeterminada para el usuario manualmente, puede usar moment-timezone con un nombre de zona horaria IANA :

moment.tz.setDefault('America/New_York');

Eso hará cumplir todo el formateo para esa zona horaria y será independiente del entorno.

Aquí hay un enlace a los documentos: https://momentjs.com/timezone/docs/#/using -timezones/default-timezone/


No es posible averiguar la zona horaria del usuario a partir del desplazamiento (porque varias zonas horarias pueden compartir el mismo desplazamiento, por ejemplo, dependiendo del horario de verano), pero puede usar los nombres de zona Etc para zonas "genéricas", por ejemplo, Etc/GMT-11 en su caso (el signo está invertido para esas zonas). En su caso, probablemente tendría más sentido almacenar la zona horaria del usuario como una configuración y conservarla en el servidor, o guardarla junto con la marca de tiempo.

Luego puede imprimir una sola fecha en una determinada zona horaria usando, por ejemplo

moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");

Gracias, @simonhaenisch

He visto el complemento tz, pero pensé que ayuda a administrar las zonas horarias, como convertir de una a otra. Y me suena raro usarlo solo para NO tocar la zona horaria en absoluto :)

Si desea establecer una zona horaria predeterminada para el usuario manualmente

Desafortunadamente, no hay una zona horaria default en el servidor. Cada usuario tiene su propia zona horaria, guardada en el perfil. Y frontend no sabe nada al respecto.

No es posible averiguar la zona horaria del usuario desde el desplazamiento

Eso está bien, no me importa la zona horaria. Todo lo que necesito es mantener la próxima fecha sin cambios.

almacene la zona horaria del usuario como una configuración y consérvela en el servidor, o guárdela junto con la marca de tiempo.

Esto es exactamente lo que está pasando. La zona horaria es una configuración y la fecha se guarda con ella como una marca de tiempo.

Dado que la API de back-end está bajo mi control, solo puedo enviar una versión reducida de la fecha, sin compensación de zona horaria. Espero que ayude.

Pero es realmente interesante por qué moment.js no tiene algo así:

moment(somDateTime).format({ formatWithDeviceTimezone: true })

o algo asi :)

Donde formatWithDeviceTimezone es falso por defecto.

De todos modos, gracias, ahora veo el problema.

Podrías probar parseZone :

por ejemplo, para una zona horaria local en BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
¿Fue útil esta página
0 / 5 - 0 calificaciones