serialize ¿Cómo hacer que JSON.NET serialice la fecha/hora en ISO 8601?



set date in json (1)

Tengo una aplicación de API web que devuelve JSON a los consumidores que pueden no estar usando las tecnologías de Microsoft. Cuando mi controlador devuelve un objeto con propiedades DateTime como JSON, serializa la fecha en este formato:

2017-03-15T00:00:00-04:00

Esto le está dando un poco de dolor de cabeza al consumidor, ya que esperan que esté en formato ISO 8601. Algunas investigaciones me han dicho que JSON.NET ahora usa ISO 8601 por defecto (estoy usando 9.0.1). Cuando ejecuto este código ...

Clipboard.Copy(JsonConvert.SerializeObject(DateTime.Now));

...Entiendo esto:

2017-03-15T09:10:13.8105498-04:00

Wikipedia muestra estos formatos válidos como ISO 8601 cuando expresa la fecha y la hora completas:

2017-03-15T11:45:42+00:00
2017-03-15T11:45:42Z
20170315T114542Z

Sin embargo, el resultado que obtuve arriba no coincide exactamente con ninguno de esos. Quiero que el formateador use 2017-03-15T11:45:42Z .

Y probablemente sea digno de otra pregunta, agregando la siguiente línea en la configuración de mi API web parece ser ignorada, ya que continúa devolviendo JSON en la fecha que se muestra arriba:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter());

Supongo que una vez que descubro el problema principal, el problema de la API web también puede resolverse.


El formato que está obteniendo es el formato ISO 8601 (lea la sección titulada Times and Time Zone Signators en Wikipedia), es solo que sus fechas aparentemente no están ajustadas a la hora UTC, por lo que está consignando un offset de zona horaria en vez del Z Zulu indicador de zona horaria.

IsoDateTimeConverter tiene configuraciones que puede usar para personalizar su salida. Puede hacer que ajuste automáticamente las fechas a UTC configurando DateTimeStyles en AdjustToUniversal . También puede personalizar el formato de salida para omitir los segundos fraccionarios si no los quiere. Por defecto, el convertidor no se ajusta a la hora UTC e incluye tantos decimales de precisión como hay disponibles para los segundos.

Prueba esto:

IsoDateTimeConverter converter = new IsoDateTimeConverter
{
    DateTimeStyles = DateTimeStyles.AdjustToUniversal,
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK"
};

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(converter);

Si sus fechas ya son UTC, pero DateTimeKind en ellas no está configurado en Utc como debería (es decir, Unspecified ), entonces idealmente debería arreglar su código para que este indicador esté configurado correctamente antes de la serialización. Sin embargo, si no puede (o no quiere) hacer eso, puede evitar cambiar la configuración del convertidor para incluir siempre el indicador Z en el formato de fecha (en lugar de usar el especificador K que mira el DateTimeKind en la fecha) y eliminar la directiva AdjustToUniversal .

IsoDateTimeConverter converter = new IsoDateTimeConverter
{
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
};




iso8601