Saltar al contenido

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

Solución:

El formato que estás obteniendo es Formato ISO 8601 (lea la sección sobre horarios y designadores de zona horaria en Wikipedia), es solo que sus fechas aparentemente no están ajustadas a la hora UTC, por lo que obtiene un desplazamiento de zona horaria adjunto a la fecha en lugar de la Z Indicador de zona horaria zulú.

los IsoDateTimeConverter tiene configuraciones que puede usar para personalizar su salida. Puede hacer que ajuste automáticamente las fechas a UTC configurando DateTimeStyles para AdjustToUniversal. También puede personalizar el formato de salida para omitir las fracciones de segundo si no las desea. Por defecto, el convertidor no se ajusta a la hora UTC e incluye tantos decimales de precisión como estén 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 el DateTimeKind en ellos no está configurado para Utc como debería ser (por ejemplo, es Unspecified), entonces, idealmente, debería corregir 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 solucionarlo cambiando la configuración del convertidor para incluir siempre la Z indicador en el formato de fecha (en lugar de utilizar el K especificador que mira el DateTimeKind en la fecha) y quitando el AdjustToUniversal directiva.

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

Agregando a la respuesta de @Brian Rogers, para ASP Core, agregue Startup.cs:

services.AddMvc()
  .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
  .AddJsonOptions(options =>
    options.SerializerSettings.Converters.Add(new IsoDateTimeConverter
    {
      DateTimeStyles = DateTimeStyles.AdjustToUniversal
    }));

Otra opción:

string json = JsonConvert.SerializeObject(DateTime.Now, new JsonSerializerSettings
{
     DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *