我正在使用JavaScriptSerializer
来序列化DateTime,但是当我反序列化时,它显示的序列化日期减少了一天:
这是测试:
DateTime startDate=new DateTime(2012,1,20);//set the 20th of January
JavaScriptSerializer serializer=new JavaScriptSerializer();
string serializeDate= serializer.Serialize(startDate);
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);//I get 19th of Jan
Assert.Equals(startDate, afterDeserialize);
首先我认为是因为javascript日期时间格式,但正如我所知,对于javascript月份是零索引0=January
,但我比原始日期少了一天。
答案 0 :(得分:20)
它不会随意丢失一天,它会转换为UTC日期(或者我应该说使用UTC日期格式的日期),所以当它被反序列化时,它就不再在你的个人时区内了。它基本上是在执行:
DateTime whateverDate = /* incoming date */;
long ticks = whateverDate.ToUniversalTime() // make UTC
.Subtract(new DateTime(1970, 1, 1)) // subtract UNIX Epoch
.TotalMilliseconds(); // get milliseconds since then
// push in to the "\/Date(ticks)\/" format
String value = String.Format(@"\/Date({0})\/", ticks);
但是,请尝试以下方法:
// or you rely on it serializing, then bring it back to your own local time
// (apply the time zone).
afterDeserialize = afterDeserialize.ToLocalTime();
您现在可以将UTC时间恢复到当地时间(应用时区)。
通过考试:
DateTime startDate = new DateTime(2012,1,20);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String serializeDate = serializer.Serialize(startDate);
DateTime afterDeserialize = serializer.Deserialize<DateTime>(serializeDate)
.ToLocalTime(); // Note: this is added
Assert.Equals(startDate, afterDeserialize); // pass!
答案 1 :(得分:3)
我遇到了同样的问题并使用
解决了这个问题Newtonsoft.Json.JsonConvert.SerializeObject()
而不是
new System.Web.Script.Serialization.JavaScriptSerializer().Serialize().
后一个调用将你的DateTime转换为一些随机时区(GMT + 0似乎是硬编码的)。
答案 2 :(得分:2)
在反序列化JavaScriptSerializer
时,我会在UTC (Universal Time)
中输出由于小时数更改而更改日期的输出。由于Brad Christie
建议将DateTime更改为UTC,因此可以解决问题。
但实际上没有必要改变:
DateTime startDate = new DateTime(2012, 1, 20).ToUniversalTime();
因为它已经把它当作世界时。所以我只是将反序列化的输出转换为LocalTime
:
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);
afterDeserialize.ToLocalTime();
它解决了这个问题。