c# - .net DateTime 序列化反序列化 bug

标签 c# asp.net datetime serialization javascriptserializer

如果您使用嵌入式 .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/

相关文章:

c# - 为什么 TypeConverter 为 ushort 类型返回的 FormatException 引用 Int16?

c# - 如何从 javaScript 使用 wcf webservice

java - ScintillaNET 控件不显示语法着色?

c# - 如何判断一个IP地址是否私有(private)?

java - 返回日期列表,给定日期间隔和星期几作为 boolean 值

StringBuilder 的 C# String.Substring 等价物?

asp.net - 如何使用 MS 网络监视器捕获对 IIS 和 Tomcat 的传入请求

c# - 如何将服务器端属性值传递到 aspx 页面框架中加载的其他 htm 页面

datetime - sas信息日期时间

python - Django 仅从日期时间中过滤并选择日期