2012-08-03 38 views
9

No estoy seguro de si me falta algo, o IE o Json.Net.Internet Explorer, Json.Net Fecha de JavaScript y cuestión de milisegundos

Pero básicamente funciona esto:

new Date("2012-08-03T12:36:54.743Z")

Esta falla con 'Fecha no válida' error:

new Date("2012-08-03T12:36:54.74Z")

La segunda fecha se almacena en SQL Server como:

2012-08-03 12:36:54.740

Es entonces serializado como JSON usando Json.Net - Json.Net no serializada la fecha como 2012-08-03T12:36:54.74Z, cortando efectivamente el último 0.

Mi pregunta (s):

  • ¿Es esta una intención comportamiento en IE - ¿que necesita tener todos los 3 dígitos en el bit milisegundos para trabajar?
  • ¿Es esto un comportamiento previsto en Json.Net, que siempre cortará los últimos 0 en una fecha?

Respuesta

11

No puedo decir si es intencional o no, pero he realizado muchas búsquedas y tampoco he encontrado una solución real para este problema. Parece que tenemos que aceptar el hecho de que IE solo acepta exactamente tres dígitos. La única manera (para mí) para evitar este problema es utilizar un convertidor de medida para Json.NET al serializar:

string json = JsonConvert.SerializeObject(
    whatEver, 
    new IsoDateTimeConverter 
     { 
      DateTimeFormat = "yyyy-MM-dd\\THH:mm:ss.fffK" 
     } 
    ); 

(sólo se probó con Json.NET 4.0.8 y 4.5.8)

Esto obliga a Json.NET a utilizar exactamente 3 decimales.

Por lo que puedo decir, Json.NET serializa los valores DateTime en formato ISO con la precisión máxima necesaria que omite los ceros finales en los lugares decimales del "segundo" valor.

Esto coincide con la salida del

someDateTimeValue.ToString("yyyy-MM-dd\\THH:mm:ss.FFFFFFFK") 
  • normal A DateTime como DateTime.UtcNow se puede serializar con hasta 7 dígitos, porque esa es la precisión de un DateTime (medida en garrapatas).
  • Si la "segunda" parte de DateTime tiene menos posiciones decimales, Json.NET omite esos ceros finales.
  • Un valor de fecha como DateTime.Today contendrá por lo tanto no dígitos detrás del "segundo" valor porque es exactamente 0.

See also this description of custom date and time format strings.

+0

tengo el mismo problema utilizando la nueva API Web ASP.NET. ¿Conoces una forma de configurar JSON.Net una vez para que esto se haga en toda la aplicación? – Julius

+8

Puede especificar el 'IsoDateTimeConverter' como predeterminado en su' GlobalConfiguration'. Abra su 'Global.asax.cs', y agregue algo como esto:' GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add (new IsoDateTimeConverter {DateTimeFormat = "aaaa-MM-dd \\ THH: mm: ss. fffK "});' – fero

+0

Excelente, justo lo que estaba buscando :) – Julius

Cuestiones relacionadas