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. linux定时任务相关

    定时任务所在文件夹 /etc/crontab 定时任务重启命令 service crond restart

  2. JavaEE 之 Spring Data JPA(二)

    1.JPQL a.定义:Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成 ...

  3. ubantu16.04搭配新开发环境说明

    安装好ubantu系统后,往往需要搭配个人开发环境,梳理了一些常用的安装步骤: 1.安装node.js 更新ubuntu软件源 sudo apt-get update sudo apt-get ins ...

  4. hadoop安装过程中出现的错误

    此次来记录一下我在安装Hadoop安装过程中出现的错误,安装过程参照慕课网林子雨教程进行安装,在尝试过程中出现的错误如下: 1.在安装Ubuntu时,新建虚拟电脑时,并没有在版本的输入框中有Ubunt ...

  5. EurekaServer高可用

    前言 之前一篇文章文章<服务注册与发现---eureka>介绍了单点EurekaServer.但是实际环境中,这种单点的的模式可能会有很多隐形的问题.比如EurekaServer发生宕机, ...

  6. Android 如何判断指定服务是否在运行中 “Service”

    如何判断一个服务是否正在运行中: /** * 判断某个服务是否正在运行的方法 * * @param mContext * @param serviceName 是包名+服务的类名 * @return ...

  7. the lime limited error

    转载自:https://blog.csdn.net/MTOY_320/article/details/78363375?locationNum=7&fps=1 经常会遇到这种令人抓狂的情况 自 ...

  8. BZOJ1897 : tank 坦克游戏

    设$f[i][j][k]$表示坦克位于$(i,j)$,目前打了不超过$k$个位置的最大得分. 初始值$f[1][1][k]$为在$(1,1)$射程内最大$k$个位置的分数总和. 对于每次移动,会新增一 ...

  9. C++程序设计方法3:虚函数

    向上映射与向下映射 派生类对象转换成基类对象,称为向上映射. 而基类对象转换成派生类对象,称为向下映射: 向上映射可由编译器自动完成,是一种隐式的自动类型转化: 凡是接受基类对象的地方(如函数参数)都 ...

  10. Java WebSocket 线程安全的保证

    Java WebSocket线程安全基于3点: 1 在新的客户端连接时,WebSocket容器会创建一个新的端点实例,对应的会话实例表示从唯一的客户端到该端点实例的唯一连接. 2 每个WebSocke ...