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()
得到的日期刚好差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方法里的一个坑的更多相关文章
- 创建一个接口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类另 ...
- angular6项目中使用echarts图表的方法(有一个坑,引用报错)
1.安装相关依赖(采用的webpack) npm install ecahrts --save npm install ngx-echarts --save 2.angular.json 配置echa ...
- 调用的方法里接收一个List<>类型的参数,里面是自定义的EC类, 我要通过反射构建这List对象
public static object CreateGeneric(Type generic, Type innerType, params object[] args) ...
- Spring,为内部方法新起一个事务,此处应有坑。
事务的作用,使我们操作能够连贯起来.而spring则是提供了一个更简单的方法,只要使用 @Transactional 一个注解,就可以保证操作的连贯性了. 普通用法,稍后再说,这里要说的是: 在最外面 ...
- Ibatis.Net执行Sql超时commandTimeout的一个坑
项目中使用了Ibatis.Net,数据库是Mysql,在做一个批量Update的操作时,需要执行40几秒,在执行到30秒的时候,会抛出异常:Timeout expired , The timeout ...
- Mysql JSON字段提取某一个属性值的函数
mysql从5.7开始才支持JSON_EXTRACT等 JSON相关的函数, 项目里用到的mysql是5.6的,需要提取JSON字段里某一个属性值进行统计, 自己写了一个笨的提取方法: CREATE ...
- Collection<T> 的一个坑
当前所在的公司偏好使用 Collection<T>(System.Collections.ObjectModel), 这货比起List<T>不仅少了很多实用方法, 而且还有一个 ...
- mongodb count 导致不正确的数量(mongodb count 一个坑)
在mongodb 集群中,if 存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...
- nodejs request module里的json参数的一个坑
今天工作的时候遇到一个坑,在客户端用nodejs给服务器发送HTTP请求,服务器老是报错:In the context of Data Services an unknown internal ser ...
随机推荐
- JavaEE-Servlet的部署和配置
1.:配置好相应环境和检查tomcat8.5能否运行,详见https://www.cnblogs.com/LJHAHA/p/10461697.html 2.将tomcat8.5下的webapps目录中 ...
- node 简单的爬虫
基于express爬虫, 1,node做爬虫的优势 首先说一下node做爬虫的优势 第一个就是他的驱动语言是JavaScript.JavaScript在nodejs诞生之前是运行在浏览器上的脚本语言, ...
- JVM之浮点数(float)表示
1. 浮点数的组成:符号位.指数位.尾数位. 1.1 符号位: 占1位,表示正负数: 1.2 指数位: 占8位: 1.3 尾数位: 占23位. 2. 浮点数的表示: 2.1 取值: sflag * ...
- 服务链路追踪---Sleuth
Sleuth:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案. 当服务与服务之间调用复杂时,Sp ...
- XamarinSQLite教程Xamarin.Android项目添加引用
XamarinSQLite教程Xamarin.Android项目添加引用 在Xamarin.Android项目中,导入System.Data和Mono.Data.SQLite库的操作步骤如下: (1) ...
- Python内存管理以及数据类型
一.内存管理 1.Cpython解释器的垃圾回收机制 什么是垃圾:当一个值身上没有绑定任何变量名(该值的引用计数=0)时,该值就是一个垃圾. Cpython解释器就会自动回收这样的垃圾. #引用计数增 ...
- Linux下MySQL数据库常用基本操作
1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...
- phpmyadmin#1045 无法登录 MySQL 服务器
使用lnmp安装wordpress在登录phpmyadmin数据库的时候诡异的出现了 phpmyadmin#1045 无法登录 MySQL 服务器,解决方法如下: 1 修改root的密码—不可以行 ...
- ACM知识点总结
1 枚举 2 模拟 3 构造 4 位运算的应用 5 查找 5.1 二分查找 5.2 分块查找 5.3 哈希查找HASH 5.3.1 线性探测法 5.3.2 字符串与哈希 6 搜索 6.1 深度优先搜索 ...
- vscode eslint配置vue遇到的问题
一.准备工作 vscode里安装eslint和vetur插件,全局安装eslint,并在项目根目录中eslint --init 二.Cannot find module 'eslint-config- ...