不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
JavascriptSerializer序列化/反序列化DateTime少了8小时原因分析
编辑:dnawo 日期:2015-01-23
先看一个栗子:

如上图所示,反序列化后的时间比原先少了8个小时,是什么原因造成的?用ILSpy对JavascriptSerializer反编译,得到源码如下:
JavascriptSerializer.Serialize -> JavascriptSerializer.SerializeDateTime:
JavascriptSerializer.Deserialize -> JavascriptObjectDeserializer.DeserializeStringIntoDateTime:
JavascriptSerializer序列化时把时间转成了UTC时间,而反序列化时没转回本地时间,本地时间和UTC时间相差为8小时,这就导致了上边的问题,因此,反序列化后我们需调用ToLocalTime方法将DateTime转成本地时间:

另一个解决方法是改用DataContractJsonSerializer类进行序列化/反序列化,这个类没有上边的问题。
复制内容到剪贴板
程序代码

JavascriptSerializer serializer = new JavascriptSerializer();
DateTime now = DateTime.Parse("2015-01-23 00:00:00");
Console.WriteLine(serializer.Deserialize<DateTime>(serializer.Serialize(now)));
DateTime now = DateTime.Parse("2015-01-23 00:00:00");
Console.WriteLine(serializer.Deserialize<DateTime>(serializer.Serialize(now)));

如上图所示,反序列化后的时间比原先少了8个小时,是什么原因造成的?用ILSpy对JavascriptSerializer反编译,得到源码如下:
JavascriptSerializer.Serialize -> JavascriptSerializer.SerializeDateTime:
复制内容到剪贴板
程序代码

private static void SerializeDateTime(DateTime datetime, StringBuilder sb, JavascriptSerializer.SerializationFormat serializationFormat)
{
if (serializationFormat == JavascriptSerializer.SerializationFormat.JSON)
{
sb.Append("\"\\/Date(");
sb.Append((datetime.ToUniversalTime().Ticks - JavascriptSerializer.DatetimeMinTimeTicks) / 10000L);
sb.Append(")\\/\"");
return;
}
sb.Append("new Date(");
sb.Append((datetime.ToUniversalTime().Ticks - JavascriptSerializer.DatetimeMinTimeTicks) / 10000L);
sb.Append(")");
}
{
if (serializationFormat == JavascriptSerializer.SerializationFormat.JSON)
{
sb.Append("\"\\/Date(");
sb.Append((datetime.ToUniversalTime().Ticks - JavascriptSerializer.DatetimeMinTimeTicks) / 10000L);
sb.Append(")\\/\"");
return;
}
sb.Append("new Date(");
sb.Append((datetime.ToUniversalTime().Ticks - JavascriptSerializer.DatetimeMinTimeTicks) / 10000L);
sb.Append(")");
}
JavascriptSerializer.Deserialize -> JavascriptObjectDeserializer.DeserializeStringIntoDateTime:
复制内容到剪贴板
程序代码

private object DeserializeStringIntoDateTime()
{
Match match = Regex.Match(this._s.ToString(), "^\"\\\\/Date\\((?<ticks>-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\"");
string value = match.Groups["ticks"].Value;
long num;
if (long.TryParse(value, out num))
{
this._s.MoveNext(match.Length);
DateTime dateTime = new DateTime(num * 10000L + JavascriptSerializer.DatetimeMinTimeTicks, DateTimeKind.Utc);
return dateTime;
}
return this.DeserializeString();
}
{
Match match = Regex.Match(this._s.ToString(), "^\"\\\\/Date\\((?<ticks>-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\"");
string value = match.Groups["ticks"].Value;
long num;
if (long.TryParse(value, out num))
{
this._s.MoveNext(match.Length);
DateTime dateTime = new DateTime(num * 10000L + JavascriptSerializer.DatetimeMinTimeTicks, DateTimeKind.Utc);
return dateTime;
}
return this.DeserializeString();
}
JavascriptSerializer序列化时把时间转成了UTC时间,而反序列化时没转回本地时间,本地时间和UTC时间相差为8小时,这就导致了上边的问题,因此,反序列化后我们需调用ToLocalTime方法将DateTime转成本地时间:
复制内容到剪贴板
程序代码

JavascriptSerializer serializer = new JavascriptSerializer();
DateTime now = DateTime.Parse("2015-01-23 00:00:00");
Console.WriteLine(serializer.Deserialize<DateTime>(serializer.Serialize(now)).ToLocalTime());
DateTime now = DateTime.Parse("2015-01-23 00:00:00");
Console.WriteLine(serializer.Deserialize<DateTime>(serializer.Serialize(now)).ToLocalTime());

另一个解决方法是改用DataContractJsonSerializer类进行序列化/反序列化,这个类没有上边的问题。






评论: 0 | 引用: 0 | 查看次数: 4912
发表评论
请登录后再发表评论!