He visto muchos estándares diferentes para el formato de fecha JSON:
"\"\\/Date(1335205592410)\\/\"" .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\"" .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z" JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00" ISO 8601
¿Cuál es la correcta? O mejor? ¿Hay algún tipo de estándar en esto?
javascript
json
Kamyar Nazeri
fuente
fuente
strings
,numbers
,true
,false
,null
,objects
Yarrays
Respuestas:
JSON en sí no especifica cómo se deben representar las fechas, pero JavaScript sí.
Usted debe utilizar el formato emitido por
Date
'stoJSON
método:2012-04-23T18:25:43.511Z
Este es el por qué:
Es legible para los humanos pero también sucinto
Se ordena correctamente
Incluye segundos fraccionarios, que pueden ayudar a restablecer la cronología.
Cumple con ISO 8601
ISO 8601 ha sido bien establecido internacionalmente por más de una década
ISO 8601 está avalado por W3C , RFC3339 y XKCD
Dicho esto , cada biblioteca de fechas jamás escrita puede comprender "milisegundos desde 1970". Entonces, para una fácil portabilidad, ThiefMaster tiene razón.
fuente
JSON.stringify({'now': new Date()}) "{"now":"2013-10-21T13:28:06.419Z"}"
-
viene antes de los dígitosASCII
, se ordenará muy bien hasta el año 100,000. ; PJSON no sabe nada sobre fechas. Lo que hace .NET es un hack / extensión no estándar.
Usaría un formato que se pueda convertir fácilmente en un
Date
objeto en JavaScript, es decir, uno al que se pueda pasarnew Date(...)
. El formato más fácil y probablemente más portátil es la marca de tiempo que contiene milisegundos desde 1970.fuente
No hay un formato correcto ; La especificación JSON no especifica un formato para intercambiar fechas, razón por la cual hay tantas formas diferentes de hacerlo.
El mejor formato es posiblemente una fecha representada en formato ISO 8601 ( ver Wikipedia ); Es un formato muy conocido y ampliamente utilizado y puede manejarse en muchos idiomas diferentes, lo que lo hace muy adecuado para la interoperabilidad. Si tiene control sobre el json generado, por ejemplo, proporciona datos a otros sistemas en formato json, eligiendo 8601 como formato de intercambio de fechas es una buena opción.
Si no tiene control sobre el json generado, por ejemplo, es el consumidor de json de varios sistemas existentes diferentes, la mejor manera de manejar esto es tener una función de utilidad de análisis de fechas para manejar los diferentes formatos esperados.
fuente
Desde RFC 7493 (El formato de mensaje I-JSON) :
I-JSON significa JSON de Internet o JSON interoperable, dependiendo de a quién le pregunte.
fuente
Date().toISOString()
yDate().toJSON()
, con la limitación de queDate
no rastrea un valor de zona horaria y, por lo tanto, siempre emite las marcas de tiempo en laZ
zona horaria UTC ( ). El valor se puede analizar connew Date("...")
yDate.parseDate
.Solo como referencia, he visto este formato utilizado:
Funciona con JSONP, que es compatible con la
$.getJSON()
función. No estoy seguro de que iría tan lejos como para recomendar este enfoque ... simplemente lanzándolo como una posibilidad porque la gente lo está haciendo de esta manera.FWIW: nunca use segundos desde epoch en un protocolo de comunicación, ni milisegundos desde epoch, porque estos están llenos de peligro gracias a la implementación aleatoria de segundos bisiestos (no tiene idea si el emisor y el receptor implementan correctamente los segundos bisiestos UTC).
Una especie de odio a las mascotas, pero muchas personas creen que UTC es solo el nuevo nombre de GMT, ¡mal! Si su sistema no implementa segundos intercalares, entonces está utilizando GMT (a menudo llamado UTC a pesar de ser incorrecto). Si implementa completamente los segundos bisiestos, realmente está utilizando UTC. Los segundos de salto futuros no se pueden conocer; IERS los publica según sea necesario y requieren actualizaciones constantes. Si está ejecutando un sistema que intenta implementar segundos intercalares pero contiene una tabla de referencia desactualizada (más común de lo que podría pensar), entonces no tiene GMT ni UTC, tiene un sistema inestable que finge ser UTC.
Estos contadores de fecha solo son compatibles cuando se expresan en un formato desglosado (a, m, d, etc.). NUNCA son compatibles en un formato de época. Mantenlo en mente.
fuente
En caso de duda, simplemente vaya a la consola web javascript de un navegador moderno presionando F12 (Ctrl + K en Firefox) y escriba lo siguiente:
Saldrá:
Ta-da !!
fuente
Creo que el mejor formato para la interoperabilidad universal no es la cadena ISO-8601, sino el formato utilizado por EJSON:
{ "myDateField": { "$date" : <ms-since-epoch> } }
Como se describe aquí: https://docs.meteor.com/api/ejson.html
Beneficios
Conclusión
Entiendo que un formato legible por humanos (cadena ISO-8601) es útil y más conveniente para el 80% de los casos de uso, y de hecho a nadie se le debe decir que no almacene sus fechas como cadenas ISO-8601 si eso es lo que hacen sus aplicaciones entender, pero para un formato de transporte universalmente aceptado que debe garantizar a ciertos valores para asegurarse de que las fechas, ¿cómo podemos permitir la ambigüedad y la necesidad de que tanto la validación?
fuente
JSON en sí no tiene formato de fecha, no le importa cómo alguien almacene las fechas. Sin embargo, dado que esta pregunta está etiquetada con JavaScript, supongo que desea saber cómo almacenar las fechas de JavaScript en JSON. Simplemente puede pasar una fecha al
JSON.stringify
método, y usaráDate.prototype.toJSON
de forma predeterminada, que a su vez usaDate.prototype.toISOString
( MDN en Date.toJSON ):También me pareció útil usar el
reviver
parámetroJSON.parse
( MDN en JSON.parse ) para convertir automáticamente las cadenas ISO a fechas de JavaScript cada vez que leía cadenas JSON.fuente
La forma preferida es usar
2018-04-23T18:25:43.511Z
...La siguiente imagen muestra por qué esta es la forma preferida:
Como puede ver, Date tiene un método nativo
toJSON
, quereturn
en este formato se puede convertir fácilmente deDate
nuevo ...fuente
En Sharepoint 2013, al obtener datos en JSON no hay formato para convertir la fecha en formato de fecha solamente, porque en esa fecha debe estar en formato ISO
Esto puede ser útil para usted.
fuente
"2014-01-01T23: 28: 56.782Z"
La fecha se representa en un formato estándar y ordenable que representa una hora UTC (indicada por la Z). ISO 8601 también admite zonas horarias al reemplazar la Z con el valor + o - para el desplazamiento de la zona horaria:
"2014-02-01T09: 28: 56.321-10: 00"
Existen otras variaciones de la codificación de zona horaria en la especificación ISO 8601, pero el formato –10: 00 es el único formato TZ que admiten los analizadores JSON actuales. En general, es mejor usar el formato basado en UTC (Z) a menos que tenga una necesidad específica de averiguar la zona horaria en la que se produjo la fecha (posible solo en la generación del lado del servidor).
NB: fecha var = nueva fecha (); console.log (fecha); // Mié 01 Ene 2014 13:28:56 GMT- 1000 (Hora estándar de Hawai)
para decirte que esa es la forma preferida a pesar de que JavaScript no tiene un formato estándar para ello
fuente
Si está utilizando Kotlin, esto resolverá su problema. (Formato MS Json)
fuente
es trabajo para mí con el servidor de análisis
fuente
Solo hay una respuesta correcta a esto y la mayoría de los sistemas se equivocan. Número de milisegundos desde la época, también conocido como un entero de 64 bits. La zona horaria es una preocupación de UI y no tiene negocios en la capa de aplicación o en la capa de base de datos. ¿Por qué a tu db le importa qué zona horaria es algo? Cuando sabes que lo almacenará como un entero de 64 bits, haz los cálculos de transformación.
Elimine los bits extraños y simplemente trate las fechas como números hasta la interfaz de usuario. Puede usar operadores aritméticos simples para hacer consultas y lógica.
fuente
El siguiente código me ha funcionado. Este código imprimirá la fecha en formato DD-MM-AAAA .
de lo contrario, también puede usar:
fuente
Creo que eso realmente depende del caso de uso. En muchos casos, podría ser más beneficioso usar un modelo de objeto adecuado (en lugar de representar la fecha en una cadena), de esta manera:
Es cierto que esto es más detallado que RFC 3339 pero:
Date.toJSON()
no)No creo que la clasificación correcta (como lo señala funroll para RFC 3339) sea una característica realmente necesaria cuando se serializa una fecha en JSON. Además, eso solo es cierto para las fechas y horas que tienen el mismo desplazamiento de zona horaria.
fuente
post contains wrong information, is poorly researched, or fails to communicate information
. Explique por cuál de estos motivos ha rechazado esta respuesta.