Mis objetos de fecha en JavaScript siempre están representados por UTC +2 debido a mi ubicación. Por lo tanto, así
Mon Sep 28 10:00:00 UTC+0200 2009
El problema es JSON.stringify
convertir la fecha anterior a
2009-09-28T08:00:00Z (notice 2 hours missing i.e. 8 instead of 10)
Lo que necesito es que se respete la fecha y la hora, pero no lo es, por lo que debería ser
2009-09-28T10:00:00Z (this is how it should be)
Básicamente uso esto:
var jsonData = JSON.stringify(jsonObject);
Intenté pasar un parámetro de reemplazo (segundo parámetro en stringify) pero el problema es que el valor ya ha sido procesado.
También intenté usar toString()
y toUTCString()
en el objeto de fecha, pero tampoco me dan lo que quiero.
¿Alguien puede ayudarme?
javascript
json
datetime
utc
Mark Smith
fuente
fuente
2009-09-28T10:00:00Z
no representa el mismo momento en el tiempo queMon Sep 28 10:00:00 UTC+0200 2009
. EnZ
una fecha ISO 8601 significa UTC, y las 10 en punto en UTC es un momento diferente en el tiempo a las 10 en punto en +0200. Una cosa sería querer que la fecha se serializara con la zona horaria correcta, pero nos está pidiendo que lo ayudemos a serializarla en una representación que sea inequívoca y objetivamente incorrecta .Respuestas:
Recientemente me encontré con el mismo problema. Y se resolvió usando el siguiente código:
fuente
JSON usa la
Date.prototype.toISOString
función que no representa la hora local, representa la hora en UTC sin modificar, si observa la salida de la fecha, puede ver que está en UTC + 2 horas, por lo que la cadena JSON cambia en dos horas, pero si esto permite que el mismo tiempo se represente correctamente en múltiples zonas horarias.fuente
Solo para que conste, recuerde que la última "Z" en "2009-09-28T08: 00: 00Z" significa que la hora está en UTC.
Consulte http://en.wikipedia.org/wiki/ISO_8601 para obtener más detalles.
fuente
Aquí hay otra respuesta (y personalmente creo que es más apropiada)
fuente
date.toJSON () imprime la fecha UTC en una cadena formateada (por lo tanto, agrega el desplazamiento cuando la convierte a formato JSON).
fuente
date.getTime()
devuelve el tiempo en milisegundos, por lo que también deberíamos convertir el segundo operando en milisegundos. Dado quedate.getTimezoneOffset()
devuelve el desplazamiento en minutos, lo multiplicamos 60000, porque 1 minuto = 60000 milisegundos. Entonces, al restar el desplazamiento de la hora actual, obtenemos la hora en UTC.puede usar moment.js para formatear con la hora local:
fuente
Llego un poco tarde, pero siempre puedes sobrescribir la función toJson en caso de una fecha usando Prototype así:
En mi caso, Util.getDateTimeString (this) devuelve una cadena como esta: "2017-01-19T00: 00: 00Z"
fuente
Por lo general, desea que las fechas se presenten a cada usuario en su propia hora local.
por eso usamos GMT (UTC).
Use Date.parse (jsondatestring) para obtener la cadena de hora local,
a menos que desee que se muestre su hora local a cada visitante.
En ese caso, use el método de Anatoly.
fuente
Solucioné este problema utilizando la
moment.js
biblioteca (la versión sin zona horaria).Estaba usando la
flatpickr.min.js
biblioteca. La hora del objeto JSON resultante creado coincide con la hora local proporcionada, pero con el selector de fecha.fuente
Solución lista para usar para forzar
JSON.stringify
ignorar zonas horarias:Usando la biblioteca moment.js:
fuente
Me encuentro con esto trabajando un poco con material heredado donde solo funcionan en la costa este de EE. UU. Y no almacenan fechas en UTC, todo es EST. Tengo que filtrar las fechas según la entrada del usuario en el navegador, por lo que debo pasar la fecha en la hora local en formato JSON.
Solo para desarrollar esta solución ya publicada, esto es lo que uso:
Entonces, según tengo entendido, esto continuará y restará el tiempo (en milisegundos (por lo tanto, 60000) de la fecha de inicio en función del desplazamiento de la zona horaria (devuelve minutos), en anticipación a la adición de tiempo que se agregará a JSON ().
fuente
Aquí hay algo realmente limpio y simple (al menos eso creo :)) y no requiere manipulación de la fecha para ser clonado o sobrecargar ninguna de las funciones nativas del navegador como toJSON (referencia: Cómo JSON encadena una fecha de javascript y preserva la zona horaria , cortejo Shawson)
Pase una función de reemplazo a JSON.stringify que encadena las cosas al contenido de su corazón. De esta manera no tienes que hacer diferencias de hora y minuto ni ninguna otra manipulación.
He puesto console.logs para ver los resultados intermedios para que quede claro qué está pasando y cómo funciona la recursividad. Eso revela algo digno de mención: value param to replacecer ya está convertido al formato de fecha ISO :). Utilice esta [tecla] para trabajar con datos originales.
fuente
JavaScript normalmente convierte la zona horaria local a UTC.
fuente
Todo se reduce a si el backend de su servidor es independiente de la zona horaria o no. Si no es así, debe asumir que la zona horaria del servidor es la misma que la del cliente, o transferir información sobre la zona horaria del cliente e incluirla también en los cálculos.
un ejemplo basado en backend de PostgreSQL:
El último es probablemente el que desea usar en la base de datos, si no está dispuesto a implementar correctamente la lógica de la zona horaria.
fuente
En lugar de
toJSON
, puede usar la función de formato que siempre da la fecha y hora correctas +GMT
fuente
Intenté esto en angular 8:
crear modelo:
en tu componente
enviar fecha a su API para guardar
Al cargar sus datos desde la API, hará esto:
model.YourDate = new Date(model.YourDate+"Z");
obtendrá su fecha correctamente con su zona horaria.
fuente