2016-03-29 91 views
2

如果使用嵌入式.net JavaScriptSerializer序列化和反序列化DateTime,如果使用UTC +,則會得到兩個不同的日期!.net日期時間序列化反序列化錯誤

實例(假設你是在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值...! !

這與JavaScriptSerializer UTC DateTime issues不同,因爲那篇文章描述了不同日期時間數據類型的反序列化的不同,並提供了一個解決方案(.UtcDateTime),它不能解決問題。事實上,嘗試使用.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)。這對了解後面發生的事情很有用,但在我的情況下,我只需要...反序列化我序列化的序列,而不是更改的utc版本... – BitQuestions

+1

我相信這實際上是.net中的一個已知錯誤串行器。 – Jeff

回答

3

有兩種不同的解決方案:或者在反序列化或使用Newtonsoft.Json時使用ToLocalTime()。

所以相同的代碼,「固定」,在第一種情況應該是:

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搜索了很多,沒有發現任何關於這個問題,只有與微軟串行發生..