2016-03-29 27 views
2

組み込みの.net JavaScriptSerializerを使用してDateTimeをシリアル化および逆シリアル化すると、UTC +の場合は2つの異なる日付になります。.net DateTimeシリアル化逆シリアル化のバグ

例(私は今の私のようにあなたはUTC + 2であると仮定)

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 !!! 

ですから、デシリアライズされた日付を取得する場合、それはデフォルトであなたにUTC + 0値をあげます...! !

これは、異なるdatetimeデータ型の逆シリアル化の違いについて説明し、問題を解決しないソリューション(.UtcDateTime)を提供するため、JavaScriptSerializer UTC DateTime issuesとは異なります。実際には、.utcDateTimeでシリアル化されたDateTimeを使用して非直列化しようとすると、間違ったUTC + 0の日付が返されます...

+1

私の推薦DateTimeOffsetオブジェクトをシリアル化/逆シリアル化する必要があります。 –

+0

私の場合、DateTimeが必要でした... DateTimeOffsetは29/03/2016 17:00:23 +02:00のようなutcオフセットを与えますが、逆シリアル化後は常にutc + 0に変換されます(29/03/2016 15:00:23 + 00:00)。これは後ろに何が起こるのか理解するのに便利ですが、私の場合は単純に...シリアル化されたものをそのままdeserializeする必要がありました。変更されたutcバージョンではありません。 – BitQuestions

+1

これは実際には、シリアライザ。 – Jeff

答えて

3

デシリアライズ時にToLocalTime()を使用するか、Newtonsoft.Jsonを使用します。

だから、同じコード、「固定」、最初のケースでは次のようになります。それ以外の場合は

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 ! 

、Newtonsoft.Json(nuGetからそれをインストールする最初の必要性、そして「Newtonsoftを使用しての追加を使用しました。上部にJSON」)、およびこのようにそれを使用します。私は、これは他の誰かのために役に立つことを願っています

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 ! 

...私は多くのことをGoogleで検索し、唯一のMicrosoftシリアライザで発生し、この問題について何も見つかりませんでした。.. 。

関連する問題