问题
I'm using json.net to deserialize a DateTimeOffset
, but it is ignoring the specified timezone and converting the datetime to the local offset. For example, given
var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}";
When deserialised using:
var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind };
var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings);
The obj will contain a property containing a DateTimeOffset
but the value will be 2012-07-19T15:30:00+10:30
i.e. converted to the local timezone instead of preserving the original timezone.
Is there a way to get the value to be parsed as expected so that the resulting DateTimeOffset
property will match the supplied value?
回答1:
It seems to be ignoring DateParseHandling.DateTimeOffset
and is using DateParseHandling.DateTime
. I would log an issue here: https://github.com/JamesNK/Newtonsoft.Json
回答2:
If you're using .NET WebApi you can add the following to the WebApiConfig.cs
file to handle this globally in your application.
config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling =
Newtonsoft.Json.DateTimeZoneHandling.Local;
This will specifically tell the JsonFormatter
to include and understand the local time zone information when serializing and deserializing a date.
回答3:
I'm not sure regarding which version did you use, because at some point of time we had the same problem, then update fixed it...
Your code works wrong for me also, but if I create class like
public class A
{
public DateTimeOffset startDateTime;
}
and call
var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings);
everything works as expected. Yes, it's bug for sure, yes, I don't know how to get result exactly as YOU want, but probably, it will help for someone else.
回答4:
Try using this:
microsoftDateFormatSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
var items = JsonConvert.DeserializeObject<List<lstObject>>(jsonString, microsoftDateFormatSettings);
I don't know if it will work in all cases but for me it did. You can try some other values for DateTimeZoneHandling
or search for more options on Google.
回答5:
This works for me, a timezone is preserved
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,
});
A JSON body is something like this
[
{
"id": 211,
"date": "2017-10-22T12:00:00+03:00",
"status": 1
},
{
"id": 212,
"date": "2017-10-28T12:00:00+03:00",
"status": 1
}
]
回答6:
To use these settings in serializer, type:
var serializerSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
var serializer = JsonSerializer.Create(serializerSettings);
回答7:
As a simple way, you can Convert Date
to Ticks
for serializing and convert it from Ticks
to Date
for deserializing:
Serializing:
DateTime date = new DateTime();
ticks = date.Ticks
Deserializing"
Datetime = new Datetime(ticks);
来源:https://stackoverflow.com/questions/11553760/why-does-json-net-deserializeobject-change-the-timezone-to-local-time