js中Serializer序列化/反序列化DateTime少了8小时解决方法

先看一个栗子:

JavascriptSerializer serializer = new JavascriptSerializer();
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(")");
}

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();
}

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());

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

时间: 2024-10-28 03:57:17

js中Serializer序列化/反序列化DateTime少了8小时解决方法的相关文章

关于JS中setTimeout()无法调用带参函数问题的解决方法_javascript技巧

本文实例分析了JS中setTimeout()无法调用带参函数问题的解决方法.分享给大家供大家参考,具体如下: 解决方法:重写setTimeout() 方法,需要用到闭包函数.如下: var _st = window.setTimeout; window.setTimeout = function(fRef, mDelay){ if (typeof fRef == 'function') { var argu = Array.prototype.slice.call(arguments, 2);

js中class的点击事件没有效果的解决方法_javascript技巧

如下所示: $(".xx").clcik(function(){····}); 本来不用js生成类,是有点击效果的一但js里写,就没有点击效果了,如下: 做如下修改即可,监听document 以上就是小编为大家带来的js中class的点击事件没有效果的解决方法全部内容了,希望大家多多支持~ 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索js class点击事件 javascript class.javascri

js中函数function $(id)与jquery发生$冲突的解决方法总结

$(id)是js document.getElementById(id)的简写,定义了这个方法以后调用的时候就可以直接用类似于jquery中那样的$("img-icon").onclick简单封装.所以很多人喜欢这样写: var $ = function(id){ return document.getElementById(id); }; 但是这一类js代码会和与JQuery对象获取函数冲突会与JQuery冲突的,导致JQuery获取不了对象,出现类似于:Uncaught TypeE

js中的window.open返回object的错误的解决方法_javascript技巧

解决window.open后返回object的错误 复制代码 代码如下: <a href="javascript:void(window.open('','','width=200,height=200'))">window.open()</a> 只在js的外层加上一个void不带返回参数的声明. 顺便在这里将window.open函数的参数使用也列出来: window.open函数参数列表 window = object.open([URL ][, name

js中判断对象是否为空的三种实现方法

 本篇文章主要是对js中判断对象是否为空的三种实现方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在写js脚本的时候经常遇到对象为空或者不是对象的情况,出现这种情况我们可以用if去判断它,然后去执行相应的处理方法,具体判断他们的方法有以下几种:   1.if   (typeOf(x)   ==   "undefined")   2.if   (typeOf(x)   !=   "object")   3.if(!x)   其中第三种是最简单的

JS中mouseover和mouseout多次触发问题如何解决_javascript技巧

问题描述 我希望当鼠标移动到id1上的时候,id2显示,当鼠标离开id1的时候,id2显示.问题如下: 1.当鼠标从id1上移动到id2上的时候,id由有显示变为不显示,然后变为显示 2.当鼠标从id2上移动到id1上的时候, id2有显示变为不显示,然后变为显示 我希望的是当鼠标在id1或者id2上移动的时候,id2一直显示,不发生变化. <script type="text/javascript" src="https://code.jquery.com/jquer

js为空或不是对象问题的快速解决方法

 这篇文章主要介绍了js为空或不是对象问题的快速解决方法.需要的朋友可以过来参考下,希望对大家有所帮助 1.加了个参数<script language="javascript" defer="defer">   2. 'null'为空或不是对象:   <script type="text/javascript"> 里面加个defer=true属性试试看,   即:<script type="text/jav

AngularJS 中使用Swiper制作滚动图不能滑动的解决方法_AngularJS

Swiper是目前较为流行的移动端触摸滑动插件,因为其简单好用易上手,受到很多前端开发者的欢迎. 今天在使用Swiper的时候遇到这个问题: 使用angularjs动态循环生成swiper-slide类,在swiper-wrapper里生成6个以上的滑动页,可是就是划不到第二页,尝试将longSwipesRatio的值修改到最小,仍然不起作用. <div class="swiper-wrapper" > <!-- =======循环部分======= --> &

JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法_javascript技巧

本文实例讲述了JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法.分享给大家供大家参考,具体如下: Uncaught SyntaxError: Unexpected token ILLEGAL 未捕获的语法错误: 意想不到的非法令牌 如下图所示: 复制代码 代码如下: <input id="btn_0_4EAE4F474C91156086C0D4EA7E983C69C215B649" type="butt