MVC Json方法里的一个坑

MVC Controller类下面有这样一个方法数据库

      //
        // Summary:
        //     Creates a System.Web.Mvc.JsonResult object that serializes the specified object
        //     to JavaScript Object Notation (JSON).
        //
        // Parameters:
        //   data:
        //     The JavaScript object graph to serialize.
        //
        // Returns:
        //     The JSON result object that serializes the specified object to JSON format. The
        //     result object that is prepared by this method is written to the response by the
        //     ASP.NET MVC framework when the object is executed.
        protected internal JsonResult Json(object data);

通常用在Action中返回一个JSON与客户端JS(JQuery)交互。json

public JsonResult getRepChangeTest()
        {
            return Json(myobj);
        }

当你的对像里有日期时间字段时,这个Json方法会把它序列化成这种格式app

"rec_dt": "/Date(1498466813000)/",

在客户端JS里,咱们把它看成字符串处理一下,而后转成js的日期格式,好比ide

function dt2(tm)
        {
            

            var time = tm.replace(/[\'\"\\\/\b\f\n\r\t)]/g, '').substring(5); console.log(time); //取得时间戳数值
            var date = new Date(parseInt(time)); //转成日期格式
            //console.log(date);
       
            // 下面根据须要转换成你要的格式
            var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); var hh = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); var mm = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); var dt= date.getFullYear() + "-" + month + "-" + currentDate + " " + hh + ":" + mm; alert(dt); }
View Code

能够还原成日期格式,如 2017-06-26 16:46,这一切看上去都很完美,然而,坑就在这里。测试

Json方法返回的时间戳(毫秒数)是基于UTC时间的(GMT 0),而个人时区是GMT+8,因此这就有了8个小时的时差。this

可是 js里的var date = new Date(xxxxx); 这个是基于UTC时间的(测试所得,没深究),因此客户端获得的时间也是正确的。若是你用C#代码这样手动验证一下spa

DateTime.Parse("1970-1-1").AddSeconds(1498466813)

获得的日期恰好差8个小时。3d

MySQL中的日期类型有datetime, timestamp,若是使用datetime,如上没有问题(虽然差个时区,但客户端也是基于UTC还原的,因此能获得正确值),但当你使用timestamp时,Json方法序列化后的值是基于当前时区的,这样js客户端用上面的方法还原后就错了,加了8个小时,由于客户端是基于UTC的,对不上。 这是真正的坑所在。从数据库里读出来,C#里调试两个类型的值没差异,都正确,可是把实体对像(定义的类型均为datetime)经Jons方法转换后结果就不一样,具体原来待研究……。调试

 

解决方法code

1. 不使用Json转换,用其它的,好比Newtonsoft.Json,通过JsonConvert.SerializeObject(obj)转换后日期已经变成日期样式的字符串格式,直接显示便可。

public ContentResult getRepChangeTest2()
        {
            var obj = rptdal.ReportChangeList();
            string json=JsonConvert.SerializeObject(obj);
            return Content(json, "application/json");
        }

2. 数据库中不使用timestamp, 改用datetime类型

相关文章
相关标签/搜索