50

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

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 将包含一个包含 a 的属性,DateTimeOffset但该值将被2012-07-19T15:30:00+10:30转换为本地时区,而不是保留原始时区。

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

4

8 回答 8

17

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

于 2012-08-01T16:19:10.733 回答
16

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

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

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

于 2015-08-28T19:14:10.767 回答
15

尝试使用这个:

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

我不知道它是否适用于所有情况,但对我来说确实有效。您可以尝试其他一些值DateTimeZoneHandling或在 Google 上搜索更多选项。

于 2014-06-30T03:43:01.920 回答
11

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

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

public class A
{
    public DateTimeOffset startDateTime;
}

并打电话

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

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

于 2012-12-17T16:01:37.320 回答
7

这对我有用,保留了时区

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
    }
]
于 2017-10-21T08:38:17.037 回答
1

要将正确Local Date的与 custom 一起使用JsonConverter,请执行以下操作:

var obj = JsonConvert.DeserializeObject(json, type, new JsonSerializerSettings {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Local,
    Converters = new JsonConverter[] { new MY_CUSTOM_CONVERTER() }
});

我在互联网上努力搜索将它们组合在一起,最终发现JsonConverter可以输入JsonSerializerSettings.

于 2020-01-30T08:21:17.107 回答
0

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

var serializerSettings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
                DateTimeZoneHandling = DateTimeZoneHandling.Local
            };
            var serializer = JsonSerializer.Create(serializerSettings);
于 2018-09-25T12:59:02.687 回答
0

作为一种简单的方法,您可以转换Date为以Ticks进行序列化并将其转换为TicksDate进行反序列化:

序列化:

DateTime date = new DateTime();
ticks = date.Ticks

反序列化”

Datetime = new Datetime(ticks);
于 2019-09-24T14:01:15.643 回答