zonas zona usar tipo horarias horaria fecha dato cambiar c# json.net datetimeoffset

c# - zona - vb datetimeoffset



¿Por qué Json.NET DeserializeObject cambia la zona horaria a la hora local? (6)

Esto funciona para mí, una zona horaria se conserva

var jss = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Local, DateParseHandling = DateParseHandling.DateTimeOffset }; var responseObj = JsonConvert.DeserializeObject<dynamic>(body, jss); return responseObj.Select(s => new { id = s["id"].Value<int>(), date = s["date"].Value<DateTimeOffset>().DateTime, });

Un cuerpo JSON es algo como esto

[ { "id": 211, "date": "2017-10-22T12:00:00+03:00", "status": 1 }, { "id": 212, "date": "2017-10-28T12:00:00+03:00", "status": 1 } ]

Estoy usando json.net para deserializar un DateTimeOffset , pero ignora la zona horaria especificada y convierte el datetime en el desplazamiento local. Por ejemplo, dado

var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}";

Cuando se deserializa utilizando:

var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind }; var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings);

El objeto contendrá una propiedad que contiene un DateTimeOffset pero el valor será 2012-07-19T15:30:00+10:30 es decir, se convertirá a la zona horaria local en lugar de preservar la zona horaria original.

¿Hay alguna manera de obtener el valor que se va a analizar como se espera para que la propiedad DateTimeOffset resultante coincida con el valor proporcionado?


Intenta usar esto:

public class A { public DateTimeOffset startDateTime; }

No sé si funcionará en todos los casos, pero para mí lo hizo. Puedes probar otros valores para DateTimeZoneHandling o buscar más opciones en Google.


No estoy seguro de qué versión usaste, porque en algún momento tuvimos el mismo problema, luego lo solucionamos ...

Tu código también funciona mal para mí, pero si creo una clase como

var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings);

y llama

microsoftDateFormatSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Local }; var items = JsonConvert.DeserializeObject<List<lstObject>>(jsonString, microsoftDateFormatSettings);

Todo funciona como se espera. Sí, es un error, sí, no sé cómo obtener el resultado exactamente como USTED desea, pero probablemente ayude a otra persona.


Para usar estos ajustes en el serializador, escriba:

var serializerSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Local }; var serializer = JsonSerializer.Create(serializerSettings);



Si está utilizando .NET WebApi, puede agregar lo siguiente al archivo WebApiConfig.cs para manejar esto globalmente en su aplicación.

config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;

Esto le indicará específicamente a JsonFormatter que incluya y comprenda la información de la zona horaria local al serializar y deserializar una fecha.