为什么Json.NET DeserializeObject更改时区,本地时间?(Why does J

2019-07-30 11:33发布

我使用json.net反序列化DateTimeOffset ,但它忽略指定的时区和日期时间转换为本地偏差。 例如,给定

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

当使用deserialised:

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属性将匹配所提供的价值?

Answer 1:

这似乎是忽略DateParseHandling.DateTimeOffset并使用DateParseHandling.DateTime 。 :我会在这里记录的问题https://github.com/JamesNK/Newtonsoft.Json



Answer 2:

如果您在使用.NET的WebAPI,你可以添加以下到WebApiConfig.cs文件到您的应用程序在全球处理这个问题。

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

确切地说,这将告诉JsonFormatter序列化和反序列化的日期时,包括和了解当地的时区信息。



Answer 3:

尝试使用这样的:

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

我不知道这是否会工作在所有情况下,但对我来说没有。 你可以尝试一些其他值DateTimeZoneHandling或搜索在谷歌更多的选择。



Answer 4:

我不知道关于哪个版本你用,因为在时间,我们有同样的问题的一些点,然后更新修复它...

您的代码对我的作品也错了,但如果我创建像类

public class A
{
    public DateTimeOffset startDateTime;
}

和呼叫

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

一切正常。 是的,这是错误的肯定,是的,我不知道如何准确地得到你想要的,但很可能,它会帮助别人。



Answer 5:

这个工作对我来说,一个时区被保留

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

一个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
    }
]


Answer 6:

要使用串行器,键入以下设置:

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


文章来源: Why does Json.NET DeserializeObject change the timezone to local time?