如何使用JSON.NET反序列化DateTime时保留时区?

Dav*_*e W 11 c# timezone datetime json.net deserialization

我正在使用JSON.NET在C#中解析一些JSON.JSON中的一个字段是日期/时间,如下所示:

{
    "theTime":"2014-11-20T07:15:11-0500",
    // ... a lot more fields ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,时间部分是07:15:11(GMT-5小时TZ)

我从这样的流解析JSON:

 using (var streamReader = new StreamReader(rcvdStream))
 {
     JsonTextReader reader = new JsonTextReader(streamReader);
     JsonSerializer serializer = new JsonSerializer();
     JObject data = serializer.Deserialize<JObject>(reader);
     //...
  }
Run Code Online (Sandbox Code Playgroud)

然后访问时间:

DateTime theTime = (DateTime)data["theTime"];
Run Code Online (Sandbox Code Playgroud)

但是,这给了我这个DateTime对象:

{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
Run Code Online (Sandbox Code Playgroud)

我需要知道原始的本地时间和tz偏移量,但我似乎在反序列化过程中丢失了这些信息,它给了我时间,我认为是我当地的时间(我在英国,所以目前在GMT + 0).

在反序列化时,我有办法保留时区信息吗?

编辑:添加了有关我如何反序列化的更多细节.

And*_*ker 17

我会用DateTimeOffset它代替.DateTime没有任何与之关联的有用时区信息.

您可以DateTimeOffset通过更改来反序列化serializer.DateParseHandling:

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
Run Code Online (Sandbox Code Playgroud)

示例: https ://dotnetfiddle.net/I9UAuC