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
});