为什么Json.NET DeserializeObject会将时区更改为本地时间?

我正在使用json.net反序列化DateTimeOffset ,但它忽略指定的时区并将datetime转换为本地偏移量。 例如,给定

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

使用以下方法进行反序列化时:

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

obj将包含一个包含DateTimeOffset的属性,但该值将为2012-07-19T15:30:00+10:30即转换为本地时区而不是保留原始时区。

有没有办法让值按预期进行解析,以便生成的DateTimeOffset属性与提供的值匹配?

它似乎忽略了DateParseHandling.DateTimeOffset并且正在使用DateParseHandling.DateTime 。 我会在这里记录一个问题: https : //github.com/JamesNK/Newtonsoft.Json

如果您使用的是.NET WebApi,则可以将以下内容添加到WebApiConfig.cs文件中,以便在应用程序中全局处理。

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

这将特别告诉JsonFormatter在序列化和反序列化日期时包含并理解本地时区信息。

试试这个:

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

我不知道它是否适用于所有情况,但对我而言确实如此。 您可以尝试使用DateTimeZoneHandling其他值或在Google上搜索更多选项。

我不确定您使用的是哪个版本,因为在某些时候我们遇到了同样的问题,然后更新修复了它……

你的代码对我来说也是错误的,但如果我创建类似的

 public class A { public DateTimeOffset startDateTime; } 

并打电话

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

一切都按预期工作。 是的,这肯定是错误的,是的,我不知道如何得到你想要的结果,但可能,这对其他人有帮助。

这对我有用,保留了时区

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

JSON主体是这样的

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

要在序列化程序中使用这些设置,请键入:

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