2012-07-19 12 views
22

Sto usando json.net per deserializzare uno DateTimeOffset, ma sta ignorando il fuso orario specificato e convertendo il datetime in offset locale. Ad esempio, datoPerché JS.NET DeserializeObject cambia il fuso orario in ora locale?

var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}"; 

Quando deserialised utilizzando:

var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind }; 
var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings); 

L'obj conterrà una struttura contenente una DateTimeOffset ma il valore sarà 2012-07-19T15:30:00+10:30 cioè convertito al fuso orario locale invece di preservare fuso orario originale.

C'è un modo per ottenere il valore da analizzare come previsto in modo che la proprietà DateTimeOffset risultante corrisponda al valore fornito?

+2

La cosa divertente è che la data/ora è in realtà corretto, 14:30 in + 9:30 devono essere le 15:30 in +10: 30. –

+0

Non sono sicuro se c'è qualche relazione qui, ma sembra che la serializzazione/deserializzazione di WCF faccia anche questo trucco di default. Forse la stessa soluzione potrebbe aiutarti: http://daveonsoftware.blogspot.com/2008/07/wcf-datetime-field-adjusted.html –

risposta

9

Sembra ignorare DateParseHandling.DateTimeOffset e utilizza DateParseHandling.DateTime. Vorrei registrare un problema qui: https://github.com/JamesNK/Newtonsoft.Json

+0

Hai risolto questo problema? Qual è stato il problema #? – Alex

+0

Non so se questo bug è stato corretto. –

+3

https://github.com/JamesNK/Newtonsoft.Json/issues/45 - Risolto il problema – alanh

7

Non sono sicuro su quale versione avete usare, perché a un certo punto del tempo che abbiamo avuto lo stesso problema, quindi aggiornare riparato ...

Le tue opere di codice sbagliato per me anche, ma se creo classe come

public class A 
{ 
    public DateTimeOffset startDateTime; 
} 

e chiamo

var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings); 

tutto funziona come previsto. Sì, è un bug di sicuro, sì, non so come ottenere risultati esattamente come vuoi, ma probabilmente, sarà di aiuto per qualcun altro.

6

Provare a utilizzare questo:

microsoftDateFormatSettings = new JsonSerializerSettings 
{ 
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, 
    DateTimeZoneHandling = DateTimeZoneHandling.Local 
}; 
var items = JsonConvert.DeserializeObject<List<lstObject>>(jsonString, microsoftDateFormatSettings); 

non so se funzionerà in tutti i casi, ma per me lo ha fatto. Puoi provare altri valori per DateTimeZoneHandling o cercare altre opzioni su Google.

8

Se si utilizza .NET WebApi, è possibile aggiungere quanto segue al file WebApiConfig.cs per gestirlo globalmente nell'applicazione.

config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = 
    Newtonsoft.Json.DateTimeZoneHandling.Local; 

Ciò specificamente dire al JsonFormatter per includere e comprendere le informazioni sul fuso orario locale durante la serializzazione e deserializzazione una data.

+0

Questo è enorme! Grazie mille. – bytebender

0

Questo funziona per me, un fuso orario è conservato

var jss = new JsonSerializerSettings 
    { 
     DateFormatHandling = DateFormatHandling.IsoDateFormat, 
     DateTimeZoneHandling = DateTimeZoneHandling.Local, 
     DateParseHandling = DateParseHandling.DateTimeOffset 
    }; 
var responseObj = JsonConvert.DeserializeObject<dynamic>(body, jss); 
return responseObj.Select(s => new { 
        id = s["id"].Value<int>(), 
        date = s["date"].Value<DateTimeOffset>().DateTime, 
       }); 

Un JSON corpo è qualcosa di simile

[ 
    { 
     "id": 211, 
     "date": "2017-10-22T12:00:00+03:00", 
     "status": 1 
    }, 
    { 
     "id": 212, 
     "date": "2017-10-28T12:00:00+03:00", 
     "status": 1 
    } 
] 
Problemi correlati