Why does Json.NET DeserializeObject change the timezone to local time?

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?


It seems to be ignoring DateParseHandling.DateTimeOffset and is using DateParseHandling.DateTime. I would log an issue here: https://github.com/JamesNK/Newtonsoft.Json

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 = 

This will specifically tell the JsonFormatter to include and understand the local time zone information when serializing and deserializing a date.

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.

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.

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

To use these settings in serializer, type:

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

Need Your Help

Best way to dynamically set an appender file path

c# log4net

I am trying to find somebody smarter than me to validate some syntax I wrote up. The idea is to configure the filename of my RollingFileAppender to the name of the assembly in order to make it mor...

how to delete files from amazon s3 bucket?

python amazon-s3 bucket

I need to write code in python that will delete the required file from an Amazon s3 bucket. I am able to connect to the Amazon s3 bucket, and also to save files, but how can I delete a file?