2016-03-29 62 views
2

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

实例(假设你是在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日期...

+1

我觉得您想要序列化/反序列化DateTimeOffset对象。 –

+0

在我的情况下,我需要DateTime ... DateTimeOffset为我提供了像29/03/2016 17:00:23 +02:00这样的utc偏移量,但它在反序列化之后总是转换为utc + 0(29/03/2016 15:00:23 +00:00)。这对了解后面发生的事情很有用,但在我的情况下,我只需要...反序列化我序列化的序列,而不是更改的utc版本... – BitQuestions

+1

我相信这实际上是.net中的一个已知错误串行器。 – Jeff

回答

3

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

我希望这将是对别人有用......我用Google搜索了很多,没有发现任何关于这个问题,只有与微软串行发生..