.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