Как сохранить часовую зону при десериализации DateTime с помощью JSON.NET?

Я разбираю JSON на С#, используя JSON.NET. Одним из полей в JSON является дата/время, например:

{
    "theTime":"2014-11-20T07:15:11-0500",
    // ... a lot more fields ...
}

Обратите внимание, что временная часть - 07:15:11 (TZ GMT-5 hrs)

Я разбираю 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"];

Однако это дает мне этот объект 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

Мне нужно знать исходное местное время и tz-смещение, но, похоже, я потерял эту информацию в процессе десериализации, и это дает мне время в том, что, как я полагаю, является моим местным временем (я в Великобритании, поэтому в настоящее время в GMT + 0).

Есть ли способ сохранить информацию о часовом поясе при десериализации?

EDIT: добавлено более подробное описание того, как я десериализую.

Ответ 1

Вместо этого я использовал бы 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

Пример: https://dotnetfiddle.net/I9UAuC