.net DateTime 序列化反序列化错误
.net DateTime Serialization Deserialization bug
如果您使用嵌入式 .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.
所以同样的代码,"fixed",在第一种情况下应该是:
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 !
我希望这对其他人有用...我在 google 上搜索了很多,但没有发现只有 Microsoft 序列化程序才会出现的这个问题...
如果您使用嵌入式 .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.
所以同样的代码,"fixed",在第一种情况下应该是:
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 !
我希望这对其他人有用...我在 google 上搜索了很多,但没有发现只有 Microsoft 序列化程序才会出现的这个问题...