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

得到的日期刚好差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类型

MVC Json方法里的一个坑的更多相关文章

  1. 创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S

    题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另 ...

  2. angular6项目中使用echarts图表的方法(有一个坑,引用报错)

    1.安装相关依赖(采用的webpack) npm install ecahrts --save npm install ngx-echarts --save 2.angular.json 配置echa ...

  3. 调用的方法里接收一个List<>类型的参数,里面是自定义的EC类, 我要通过反射构建这List对象

              public static object CreateGeneric(Type generic, Type innerType, params object[] args)     ...

  4. Spring,为内部方法新起一个事务,此处应有坑。

    事务的作用,使我们操作能够连贯起来.而spring则是提供了一个更简单的方法,只要使用 @Transactional 一个注解,就可以保证操作的连贯性了. 普通用法,稍后再说,这里要说的是: 在最外面 ...

  5. Ibatis.Net执行Sql超时commandTimeout的一个坑

    项目中使用了Ibatis.Net,数据库是Mysql,在做一个批量Update的操作时,需要执行40几秒,在执行到30秒的时候,会抛出异常:Timeout expired , The timeout ...

  6. Mysql JSON字段提取某一个属性值的函数

    mysql从5.7开始才支持JSON_EXTRACT等 JSON相关的函数, 项目里用到的mysql是5.6的,需要提取JSON字段里某一个属性值进行统计, 自己写了一个笨的提取方法: CREATE ...

  7. Collection<T> 的一个坑

    当前所在的公司偏好使用 Collection<T>(System.Collections.ObjectModel), 这货比起List<T>不仅少了很多实用方法, 而且还有一个 ...

  8. mongodb count 导致不正确的数量(mongodb count 一个坑)

    在mongodb 集群中,if  存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...

  9. nodejs request module里的json参数的一个坑

    今天工作的时候遇到一个坑,在客户端用nodejs给服务器发送HTTP请求,服务器老是报错:In the context of Data Services an unknown internal ser ...

随机推荐

  1. thinkphp5 Request请求类

    获取请求类的几种方式: 1.助手函数(严格不算ba ) input('post.name'): 2.$request=\think\Request::instance(); 3.控制器中必须继承Con ...

  2. Java常用API——String字符串运算

    一.字符串运算 String类 1.概述 String是特殊的引用数据类型,它是final类. 2.构造方法 String str = "abc"; 相当于:  char date ...

  3. Working out(DP)

    题目描述: 题意: 有n*m个格子, 走过一个格子可以得到相应的分数. A 从(1,1)沿 下 或 右 走到(n,m) B 从(n,1)沿 上 或 右 走到(1,m) 两人路径有且只能有一个格子重合( ...

  4. HYSBZ 4034 【树链剖分】+【线段树 】

    <题目链接> 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权值.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...

  5. flex 布局的复习

  6. DOCKER 是什么?!

    Docker,改变程序世界的箱子 给产品经理讲技术 • 2016-01-14 • 深氪 Docker的道理和集装箱一样. 本文来自微信公众号“给产品经理讲技术”(pm_teacher),欢迎大家关注. ...

  7. PHP 对POST数据的处理

    // 获取body中json数据并初始化为数组$data = json_decode(file_get_contents('php://input'), true);

  8. C#最简单的连接数据库的方法

    在vs2010下建立项目(可以是WEB或者是FORM窗体应用程序),在VS2010中,找到“服务器资源管理器”,右击“数据连接”.在添加连接中设置服务器名(登录SQL Server时的服务器名称,可以 ...

  9. 2017-9-17-Windows Live Writer常用快捷键

    Window Live Writer常用的快捷键: 将当前文章发布到博客:CTRL+SHIFT+P 打开新文章: CTRL+N 将草稿保存到计算机上: CTRL+S 切换到"普通" ...

  10. 2110 ACM Crisis of HDU 母函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2110 题意:分出1/3的价值,有几种可能? 思路:母函数 与之前的题目2079相似,复习笔记再来写代码: ...