如何使用 JSON.NET 反序列化日期时间时保留时区
本文关键字:时间 保留 时区 日期 反序列化 何使用 JSON NET | 更新日期: 2023-09-27 18:31:08
我正在使用 JSON.NET 解析C#中的一些JSON。 JSON 中的一个字段是日期/时间,如下所示:
{
"theTime":"2014-11-20T07:15:11-0500",
// ... a lot more fields ...
}
请注意,时间部分为 07:15:11(TZ of GMT-5 小时)
我从流中解析 JSON,如下所示:
using (var streamReader = new StreamReader(rcvdStream))
{
JsonTextReader reader = new JsonTextReader(streamReader);
JsonSerializer serializer = new JsonSerializer();
JObject data = serializer.Deserialize<JObject>(reader);
//...
}
然后访问时间:
DateTime theTime = (DateTime)data["theTime"];
但是,这给了我这个日期时间对象:
{20/11/2014 12:15:11}
Date: {20/11/2014 00:00:00}
Day: 20
DayOfWeek: Thursday
DayOfYear: 324
Hour: 12
Kind: Local
Millisecond: 0
Minute: 15
Month: 11
Second: 11
Ticks: 635520825110000000
TimeOfDay: {12:15:11}
Year: 2014
我需要知道原始本地时间和 tz 偏移量,但我似乎在反序列化过程中丢失了这些信息,它给了我我认为是我当地时间的时间(我在英国,所以目前在 GMT+0)。
反序列化时有没有办法保留时区信息?
编辑:添加了有关我如何反序列化的更多详细信息。
我会用DateTimeOffset
来代替。 DateTime
没有任何与之关联的有用时区信息。
您可以通过更改serializer.DateParseHandling
来反序列化为DateTimeOffset
:
JsonSerializer serializer = new JsonSerializer();
serializer.DateParseHandling = DateParseHandling.DateTimeOffset;
JObject data = serializer.Deserialize<JObject>(reader);
var offset = (DateTimeOffset)data["theTime"];
Console.WriteLine(offset.Offset); // -5:00:00
Console.WriteLine(offset.DateTime); // 11/20/2014 7:15:11 AM
示例:https://dotnetfiddle.net/I9UAuC