![](/img/trans.png)
[英]How to get Javascript Objects from JavaScriptSerializer?
[英]JavaScriptSerializer is subtracting one day from date
我正在使用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 datetime格式而将其关闭,但是正如我所知道的javascript,Month是零索引0=January
,但是我得到的日期比原始日期少一天。
它不会任意损失一天,它会转换为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!
我有同样的问题,并通过使用解决了
Newtonsoft.Json.JsonConvert.SerializeObject()
代替
new System.Web.Script.Serialization.JavaScriptSerializer().Serialize().
后面的调用将您的DateTime存储为转换为某个随机时区(GMT + 0似乎是硬编码的)。
在反序列化JavaScriptSerializer
UTC (Universal Time)
,以小时为单位给我输出UTC (Universal Time)
,这会更改日期。 正如Brad Christie
建议将DateTime更改为UTC一样,它可以解决问题。
但是实际上没有必要更改:
DateTime startDate = new DateTime(2012, 1, 20).ToUniversalTime();
因为它已经把它当作世界时间。 所以我只是将反序列化的输出转换为LocalTime
:
DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);
afterDeserialize.ToLocalTime();
它解决了这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.