如果您使用嵌入式 .net JavaScriptSerializer 序列化和反序列化 DateTime,那么如果您使用 UTC+something,您会得到两个不同的日期!
示例(假设您像我现在一样处于 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 日期...
最佳答案
有两种不同的解决方案:反序列化时使用 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安装它,然后在顶部添加“using 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 序列化程序中...
关于c# - .net DateTime 序列化反序列化 bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36287255/