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)交互。
public JsonResult getRepChangeTest() { return Json(myobj); }
当你的对像里有日期时间字段时,这个Json方法会把它序列化成这种格式
"rec_dt": "/Date(1498466813000)/",
在客户端JS里,我们把它当作字符串处理一下,然后转成js的日期格式,比如

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); }
可以还原成日期格式,如 2017-06-26 16:46,这一切看上去都很完美,然而,坑就在这里。
Json方法返回的时间戳(毫秒数)是基于UTC时间的(GMT 0),而我的时区是GMT+8,所以这就有了8个小时的时差。
但是 js里的var date = new Date(xxxxx); 这个是基于UTC时间的(测试所得,没深究),所以客户端得到的时间也是正确的。如果你用C#代码这样手动验证一下
DateTime.Parse("1970-1-1").AddSeconds(1498466813)
得到的日期刚好差8个小时。
MySQL中的日期类型有datetime, timestamp,如果使用datetime,如上没有问题(虽然差个时区,但客户端也是基于UTC还原的,所以能得到正确值),但当你使用timestamp时,Json方法序列化后的值是基于当前时区的,这样js客户端用上面的方法还原后就错了,加了8个小时,因为客户端是基于UTC的,对不上。 这是真正的坑所在。从数据库里读出来,C#里调试两个类型的值没差别,都正确,但是把实体对像(定义的类型均为datetime)经Jons方法转换后结果就不同,具体原来待研究……。
解决方法
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类型
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述