2013-05-22 13 views
11

Wiem, że to pytanie zostało zafiksowane wiele razy i przeczytałem wiele postów na temat tego hashu, ale nadal jestem zdezorientowany.DateTime Json Powrót z WebAPI z domyślnym Serializerem

Przy użyciu MVC4/WebAPI, mam datetime, który jest po prostu utworzony jako nowy DateTime.Now.

Moje dane powrotne WebAPI jest tak:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, new 
      { 
       data = sessionRecordSmalls, 
       count = sessionRecordSmalls.Count, 
       success = true 
      }); 

gdzie sessionRecordsSmall ma własność publiczną DateTime w nim.

Kiedy patrzę na datę w debuggerze VS, pokazuje ją jako teraz bez strefy czasowej, ponieważ DateTime nie zawiera strefy czasowej.

{06.10.2012 09:45:00}

Kiedy patrzę na to, co zostanie pobrana z serwera, widzę w JSON

2012-10-06T09: 45: 00

Myślę, że T0 oznacza Strefę czasową 0, a nie 100% pewności. Moja biblioteka JavaScript interpretuje ją jako strefę czasową 0, a następnie pokazuje aktualną datę pobraną jako GMT (-9 godzin temu dla mnie).

Moje pytanie brzmi, co to jest pobrany JSON? Czy to jest strefa czasowa? Czy brakuje tu jakiegoś ważnego kroku?

Odpowiedz

12

Godzina Data 2012-10-06T09:45:00, którą otrzymujemy w JSON z interfejsem Web API i serializerem domyślnym to format the ISO 8601. To jest tak zwana Combined date and time representations. Ekstrakt:

..A pojedynczy punkt w czasie może być reprezentowany przez złączenie się pełna data wyraz, litera T jako ogranicznik oraz poprawne wyrażenie czasu. Na przykład "2007-04-05T14: 30" ...

Brak informacji o strefie czasowej w tym formacie. Jak wspomniano w ekstrakcie Time zone designators:

Strefy czasowe w ISO 8601 są reprezentowane czasu lokalnego (z miejscu nieokreślonym), a UTC, lub jako przesunięcie od UTC. Jeśli nie podano informacji o relacji UTC z reprezentacją czasu, czas jest ustawiony na czas lokalny .

Innymi słowy, jeśli nie ma przesunięcia względem określonego czasu UTC, jest on traktowany jako czas lokalny.

UTC format zostanie rozszerzony o Z na koniec

Jeśli czas jest w UTC, dodać oo bezpośrednio po czasie bez przestrzeni. Z jest oznacznikiem strefy dla zerowego przesunięcia UTC. "09:30 UTC" jest zatem reprezentowany jako "09: 30Z" lub "0930Z". "14:45:15 UTC" będzie być "14: 45: 15Z" lub "144515Z".

czas UTC jest znany także jako czas 'Zulu', ponieważ 'Zulu' to NATO alfabet fonetyczny słowo 'Z'.

Więc data-czas my otrzymaliśmy to format ISO 8601, traktowane jako strefy czasu lokalnego (bez Z na końcu tak 2012-10-06T09:45:00Z)

+3

Zauważyłem, że kiedy ozdobić mój datetime z: [JsonProperty (ItemConverterType = typeof (JavaScriptDateTimeConverter))] publicznego DateTime LogDate {get; zestaw; } Dostaję to, czego oczekuję od konwersji, czy nie powinno to być domyślne? –

+0

Szczerze mówiąc nie jestem pewien ... ale proponuję przeczytać ten http://icanmakethiswork.blogspot.cz/2012/04/beg-steal-or-borrow-decent-javascript.html ... Robię konwersję na UTC także z hackowaniem –

35

jeśli szeregowania z json.net pamiętać, że możesz określić DateTimeZoneHandling.

przykład w WebApiConf.cs

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.DateTimeZoneHandling =Newtonsoft.Json.DateTimeZoneHandling.Local; 
+0

Pomoże mi to zaoszczędzić czas. Dziękuję bardzo –

Powiązane problemy