我使用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
属性将匹配所提供的价值?
这似乎是忽略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<List<lstObject>>(jsonString, microsoftDateFormatSettings);
我不知道这是否会工作在所有情况下,但对我来说没有。 你可以尝试一些其他值DateTimeZoneHandling
或搜索在谷歌更多的选择。
我不知道关于哪个版本你用,因为在时间,我们有同样的问题的一些点,然后更新修复它...
您的代码对我的作品也错了,但如果我创建像类
public class A
{
public DateTimeOffset startDateTime;
}
和呼叫
var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings);
一切正常。 是的,这是错误的肯定,是的,我不知道如何准确地得到你想要的,但很可能,它会帮助别人。
这个工作对我来说,一个时区被保留
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
}
]
要使用串行器,键入以下设置:
var serializerSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
var serializer = JsonSerializer.Create(serializerSettings);