2014-11-20 2 views
10

Я разбираю некоторые JSON в C# с помощью JSON.NET. Одно из полей в формате JSON является дата/время, как это:Как сохранить часовой пояс при десериализации DateTime с использованием JSON.NET?

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

Обратите внимание, что время часть 7:15:11 (TZ от 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"]; 

Однако, это дает мне этот объект 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: дополнительная информация о том, как я десериализую.

+0

Как вы создаете ваш 'объект serializer'? – DavidG

+0

Вы пытались десериализовать/отбрасывать его на DateTimeOffset, а не на DateTime? –

+0

Я обновил сообщение, чтобы показать, как я создаю объект serializer. –

ответ

15

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

+0

Это сделало трюк! Большое спасибо. –

+0

@ DaveW: Конечно, рад помочь. –

Смежные вопросы