我有一个json字符串,需要转换为JObject。
示例:
String result = ""{"totalSize":1,"done":true,"records":[{"attributes":{"type":"Municipio__c","url":"/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"},"Id":"a0V2C000000gIgzUAE","LastModifiedDate":"2017-08-01T18:12:04.000+0000"}]}";"
var json = JObject.Parse(result);
但在转换时, LastModifiedDate 已将值更改为时区。
就像那样:
{{
"totalSize": 1,
"done": true,
"records": [
{
"attributes": {
"type": "Municipio__c",
"url": "/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"
},
"Id": "a0V2C000000gIgzUAE",
"LastModifiedDate": "2017-08-01T15:12:04-03:00"
}
]
}}
小时改变了: 18:12:04 (hh:MM:ss)到 15:12:04 (hh:MM:ss)。
有没有办法忽略解析上的时区?
答案 0 :(得分:4)
您必须将JsonConvert
与相应的DateTimeZoneHandling
:
var json = JsonConvert.DeserializeObject
( result
, new JsonSerializerSettings()
{ DateTimeZoneHandling = DateTimeZoneHandling.Utc
}
);
答案 1 :(得分:1)
时间实例是相同的。 18:12:04+00:00
与15:12:04-03:00
和21:12:04+03:00
(希腊当前的偏移量)相同。
解析日期值时的默认行为是生成本地DateTime
值,即其Kind属性为DatTimeKind.Local。其他DateTimeKind值为UTC和未指定。
这并不意味着值已更改。 Local
是一个相对术语 - 如果不知道实际的偏移量,很容易误解它。
正如Patrick Hofman所解释的那样,您可以通过设置DateTimeZoneHandling
设置来指定使用UTC。
更好的方法是使用DateTimeOffset
属性指定将DateTime
代替DateParseHandling = DateParseHandling.DateTimeOffset
。这将返回保留原始时区信息:
var settings=new JsonSerializerSettings{
DateParseHandling = DateParseHandling.DateTimeOffset
};
var json = JsonConvert.DeserializeObject( result, settings);
在这种情况下,该值为DateTimeOffset,其原始时间和偏移量为00:00
。
我在这里使用dynamic
来降低施法噪音:
var settings=new JsonSerializerSettings{
DateParseHandling = DateParseHandling.DateTimeOffset
};
dynamic json = JsonConvert.DeserializeObject( result, settings);
var value=(DateTimeOffset)(json.records[0].LastModifiedDate.Value);
Console.WriteLine("{0:o}",value);
这将返回:
2017-08-01T18:12:04.0000000+00:00