2016-03-29 10 views
2

Wenn Sie ein DateTime mit eingebetteten .net JavaScriptSerializer serialisieren und deserialisieren, erhalten Sie zwei verschiedene Daten, wenn Sie in UTC + etwas sind!.net DateTime Serialization Deserialization Fehler

Beispiel (angenommen, Sie in UTC + 2 sind wie ich jetzt bin)

JavaScriptSerializer myJson = new JavaScriptSerializer(); 

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00 
strSerialized = myJson.Serialize(myDate); 

//DO WHAT YOU NEED WITH IT... 

DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized); 
Label1.Text=myDateDes.ToString();//it gives you 2016-03-29 14:12:00 ! WRONG! IT's in UTC+0 ! Has 2 HOURS less !!! 

Also, wenn Sie das deserialisiert Datum zu bekommen, wird es Ihnen die UTC + 0 Wert standardmäßig geben ...! !

Dies unterscheidet sich von JavaScriptSerializer UTC DateTime issues, da dieser Artikel den Unterschied in der Deserialisierung verschiedener Datetime-Datentypen beschreibt und eine Lösung (.UtcDateTime) bereitstellt, die das Problem nicht behebt. Bei der Deserialisierung mit .utcDateTime gibt eine serialisierte DateTime immer das falsche UTC + 0 Datum ...

+1

ich gues s Sie möchten stattdessen ein DateTimeOffset-Objekt serialisieren/deserialisieren. –

+0

In meinem Fall brauchte ich die DateTime ... die DateTimeOffset gibt mir den UTC Offset wie 29/03/2016 17:00:23 +02: 00 aber es konvertiert immer nach der Deserialisierung in die UTC + 0 (29/03/2016 15:00:23 +00: 00). Dies ist nützlich, um zu verstehen, was dahinter passiert, aber in meinem Fall brauchte ich einfach ... genau das zu deserialisieren, was ich serialisiert habe, keine geänderte Version davon ... – BitQuestions

+1

Ich glaube, das ist in der Tat ein bekannter Bug im .net Serialisierer. – Jeff

Antwort

3

Es gibt zwei verschiedene Lösungen: Entweder ToLocalTime() verwenden, wenn Sie deserialisieren ODER das Newtonsoft.Json verwenden.

Also der gleiche Code, „fixiert“, sollte im ersten Fall sein:

JavaScriptSerializer myJson = new JavaScriptSerializer(); 

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00 
strSerialized = myJson.Serialize(myDate); 

//DO WHAT YOU NEED WITH IT... 

DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized).ToLocalTime(); 

Label1.Text=myDateDes.ToString();//it gives you 2016-03-29 16:12:00 !!! CORRECT ! 

Andernfalls mit Newtonsoft.Json (müssen Sie es zuerst von NuGet installieren, dann ein „mit Newtonsoft hinzufügen. json“an der Spitze), und es wie folgt verwenden:

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00 
strSerialized = JsonConvert.SerializeObject(myDate); 

//DO WHAT YOU NEED WITH IT... 

DateTime myDateDes = JsonConvert.DeserializeObject<DateTime>(strSerialized); 
Label1.Text=myDateDes.ToString();//NO need to convert to LocalTime... it already gives you 2016-03-29 16:12:00 !!! CORRECT ! 

ich hoffe, das für jemand anderen nützlich sein wird ... gegoogelt ich viel und fand nichts über dieses Problem, das nur mit Microsoft Serializer geschieht ..