.net DateTime序列化反序列化错误

如果使用嵌入式.net JavaScriptSerializer对DateTime进行序列化和反序列化,如果使用UTC +,则会得到两个不同的日期!

例子(假设你现在在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问题有所不同,因为该文章描述了不同日期时间数据类型的反序列化中的差异,并提供了解决方案(.UtcDateTime),该解决方案不能解决问题。 事实上,试图用.utcDateTime反序列化一个序列化的DateTime总会给你错误的UTC + 0日期...


有两种不同的解决方案:在反序列化或使用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 !

我希望这会对其他人有用......我搜索了很多,并没有发现这个问题,只发生在Microsoft序列化程序中......

链接地址: http://www.djcxy.com/p/46641.html

上一篇: .net DateTime Serialization Deserialization bug

下一篇: ISO8601 to DateTime with time zone information preserved