2014-11-20 11 views
10

Parsuję niektóre JSON w C# przy użyciu JSON.NET. Jedno z pól w JSON jest data/czas, tak:Jak zachować strefę czasową podczas deserializacji DateTime przy użyciu JSON.NET?

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

Należy zauważyć, że część jest godzina 07:15:11 (TZ z GMT-5 godzin)

I analizować JSON ze strumienia jak ten:

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

Następnie otworzyć czas:

DateTime theTime = (DateTime)data["theTime"]; 

jednak to daje mi ten obiekt 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 

muszę wiedzieć oryginalnego czasu lokalnego i tz offset, ale wydaje się, że stracił tę informację w procesie deserializacji, a to daje mi czas na to, co przypuszczam jest mój czas lokalny (I” mw Wielkiej Brytanii, czyli obecnie na GMT + 0).

Czy istnieje sposób dla mnie, aby zachować informacje o strefie czasowej podczas deserializacji?

EDYCJA: dodano więcej szczegółów na temat deserializacji.

+0

Jak się tworząc swój obiekt 'serializer'? – DavidG

+0

Czy próbowałeś deserializacji/rzutowania go do DateTimeOffset zamiast DateTime? –

+0

Zaktualizowałem wpis, aby pokazać, w jaki sposób tworzę obiekt serializera. –

Odpowiedz

15

Zamiast tego użyję zamiast tego DateTimeOffset. DateTime nie zawiera żadnych przydatnych informacji związanych z strefą czasową.

Można deserializowania do DateTimeOffset zamiast zmieniając 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 

Przykład:https://dotnetfiddle.net/I9UAuC

+0

To wystarczy! Dziękuję Ci bardzo. –

+0

@DaveW: Oczywiście, cieszę się z pomocy. –

Powiązane problemy