Dav*_*per 34 c# datetimeoffset json.net
我正在使用json.net来反序列化a DateTimeOffset,但它忽略了指定的时区并将datetime转换为本地偏移量.例如,给定
var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}";
Run Code Online (Sandbox Code Playgroud)
使用以下方法进行反序列化时:
var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind };
var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings);
Run Code Online (Sandbox Code Playgroud)
obj将包含一个包含a的属性,DateTimeOffset但该值将被2012-07-19T15:30:00+10:30转换为本地时区而不是保留原始时区.
有没有办法让值按预期进行解析,以便结果DateTimeOffset属性与提供的值匹配?
Pet*_*hie 15
它似乎忽略DateParseHandling.DateTimeOffset并正在使用DateParseHandling.DateTime.我会在这里记录一个问题:https://github.com/JamesNK/Newtonsoft.Json
txa*_*ier 12
如果您使用的是.NET WebApi,则可以将以下内容添加到WebApiConfig.cs文件中,以便在应用程序中全局处理.
config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling =
Newtonsoft.Json.DateTimeZoneHandling.Local;
Run Code Online (Sandbox Code Playgroud)
这将特别告诉JsonFormatter在序列化和反序列化日期时包含并理解本地时区信息.
cho*_*dze 10
我不确定您使用的是哪个版本,因为在某些时候我们遇到了同样的问题,然后更新修复了它......
你的代码对我来说也是错误的,但如果我创建类似的
public class A
{
public DateTimeOffset startDateTime;
}
Run Code Online (Sandbox Code Playgroud)
并打电话
var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings);
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.是的,这肯定是错误的,是的,我不知道如何得到你想要的结果,但可能,这对其他人有帮助.
试试这个:
microsoftDateFormatSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
var items = JsonConvert.DeserializeObject<List<lstObject>>(jsonString, microsoftDateFormatSettings);
Run Code Online (Sandbox Code Playgroud)
我不知道它是否适用于所有情况,但对我而言确实如此.您可以尝试使用其他值DateTimeZoneHandling或在Google上搜索更多选项.
小智 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,
});
Run Code Online (Sandbox Code Playgroud)
一个 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
}
]
Run Code Online (Sandbox Code Playgroud)