nodejs向前台send数据时Date类型数据格式问题

1.现象

前端向nodejs服务器请求数据时,发现得到的返回数据中日期字段(json格式)值不熟,处理时发现有时差

从mysql中读出的时间格式 > publishtime:Sat Aug 19 2017 15:46:01 GMT+0800 (中国标准时间)

前端收到的时间格式 > "publishtime":"2017-07-16T14:46:01.000Z"

“Sat Aug 19 2017 15:46:01 GMT+0800”这个可以用new date 得到和设置的时间一致,但是用json序列化过的时间重新new 后得到的时间和设置的时间相差8个小时。原因是时间对象在转化成json字符串时会被转换成国际标准时间(ISO),而不是当前国家区域的时间,而用new Date转成时间对象返回的是当前国家所在时区的时间,东八区就加上了8个小时。2.解决nodejs发送前数据转化在response.js中,

res.send = function send(body) {
  var chunk = body;
  var encoding;
  var len;
  var req = this.req;
  var type;

  // settings
  var app = this.app;

  // allow status / body
  if (arguments.length === 2) {
    // res.send(body, status) backwards compat
    if (typeof arguments[0] !== ‘number‘ && typeof arguments[1] === ‘number‘) {
      deprecate(‘res.send(body, status): Use res.status(status).send(body) instead‘);
      this.statusCode = arguments[1];
    } else {
      deprecate(‘res.send(status, body): Use res.status(status).send(body) instead‘);
      this.statusCode = arguments[0];
      chunk = arguments[1];
    }
  }

  // disambiguate res.send(status) and res.send(status, num)
  if (typeof chunk === ‘number‘ && arguments.length === 1) {
    // res.send(status) will set status message as text string
    if (!this.get(‘Content-Type‘)) {
      this.type(‘txt‘);
    }

    deprecate(‘res.send(status): Use res.sendStatus(status) instead‘);
    this.statusCode = chunk;
    chunk = statuses[chunk]
  }

  switch (typeof chunk) {
    // string defaulting to html
    case ‘string‘:
      if (!this.get(‘Content-Type‘)) {
        this.type(‘html‘);
      }
      break;
    case ‘boolean‘:
    case ‘number‘:
    case ‘object‘:
      if (chunk === null) {
        chunk = ‘‘;
      } else if (Buffer.isBuffer(chunk)) {
        if (!this.get(‘Content-Type‘)) {
          this.type(‘bin‘);
        }
      } else {
        return this.json(chunk);
      }
      break;
  }
...............此处省略.................

如果发送的数据是对象的话,会转换成json字符串格式后在发送,下面是json转换

res.json = function json(obj) {
  var val = obj;

  // allow status / body
  if (arguments.length === 2) {
    // res.json(body, status) backwards compat
    if (typeof arguments[1] === ‘number‘) {
      deprecate(‘res.json(obj, status): Use res.status(status).json(obj) instead‘);
      this.statusCode = arguments[1];
    } else {
      deprecate(‘res.json(status, obj): Use res.status(status).json(obj) instead‘);
      this.statusCode = arguments[0];
      val = arguments[1];
    }
  }

  // settings
  var app = this.app;
  var replacer = app.get(‘json replacer‘);
  var spaces = app.get(‘json spaces‘);
  var body = stringify(val, replacer, spaces);

  // content-type
  if (!this.get(‘Content-Type‘)) {
    this.set(‘Content-Type‘, ‘application/json‘);
  }

  return this.send(body);
};

继续跟踪发现 xx\plugins\JavaScriptLanguage\lib\JavaScriptLanguage.jar!\com\intellij\lang\javascript\index\predefined\EcmaScript5.js 这里有这两句

Date.now = function() {};
/**
@return {string}
*/
Date.prototype.toJSON = function() {};

发现原来日期类型有专门的转化处理方式的。所以我的解决方式是 覆盖这个方法,返回time长整型,方便处理,也不容易有时区转化问题。

Date.prototype.toJSON = function () {
    return this.getTime();
}

当然如果只是展示成一般格式的话可以用这个,直接网上拷贝一个,可以看这个博客http://www.cnblogs.com/vipstone/p/4953110.html

function dateFormat(date, fmt) {
    if (null == date || undefined == date) return ‘‘;
    var o = {
        "M+": date.getMonth() + 1, //月份
        "d+": date.getDate(), //日
        "h+": date.getHours(), //小时
        "m+": date.getMinutes(), //分
        "s+": date.getSeconds(), //秒
        "S": date.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}


时间: 2024-08-25 04:55:34

nodejs向前台send数据时Date类型数据格式问题的相关文章

java用POI读取excel时date类型出现的问题

最近用poi读取excel并传入数据库中,但是出现了一个非常奇葩的问题,一直困扰了我很久 就是读取时date类型出现年份和日读取正确,但是月份为00的情况,我冥思苦想了很找了久,一直找不到原因 今天突然发现时自己粗心导致的 之前的错误代码: Date time=new Date(); time=cell.getDateCellValue(); //按指定格式输出 SimpleDateFormat df=new SimpleDateFormat("yyyy/mm/dd hh:mm:ss"

mootools使用Request.send()数据时刷新整个页面

今天使用mootools做ajax登录时使用Request().send()数据时老是刷新整个页面,换成Requesr.JSON()也不行,弄了好长时间,很郁闷啊,最后终于发现onSuccess:function(responseJSON,text){ $('result').set('html',responseJSON.info); if(responseJSON.status==1){ window.location='__ROOT__'; } },中有错误,还是服务器端php反回值不全造

java程序转换excel中科学记数法的数据为date类型

今天出于某些原因从mongodb数据库中导出了一些数据,为了更直观的发送给其他人查阅,便使用mongoVUE的导出为excel功能. 但是导出后出现了一个问题,里边有一列存储时间的,存储的是long型毫秒数,在导出后就自动变成了科学记数法. 且不说从科学记数法中辨别出实际时间,即便是原本的毫秒值也是不易于辨别的,但是这些long值不能直接在excel中转换成date类型,因此我便想到使用poi来把这些毫秒值转换成date再写入原文件中. 从mongodb中导出的excel的科学记数法如下图: j

oracle中时间戳转为Date类型的数据

问题描述: 一个表中原本应该存放date类型的数据,但是不知道之前哪位大仙把两个字段的类型建成了NUMBER类型的了,这样在后台看时间肯定不方便.现在需要改成date类型,但是现在库中是有数据的,不能直接从NUMBER改为DATE.所以需要建立先创建两个DATE类型的临时字段,然后把对应字段的数据转换为Date类型的数据之后存到新字段上面,最后删除老字段,将新字段改名为老字段. 一.新建两个临时字段 ALTER TABLE CS_USER ADD (CREATEDATE1 DATE,OPERAT

SpringMVC 处理Date类型数据@InitBinder @DateTimeFormat 注解 的使用

使用SpringMVC的时候,需要将表单中的日期字符串转换成对应JavaBean的Date类型,而SpringMVC默认不支持这个格式的转换,解决方法有两种,如下: 方法一 . 在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作. /* 以下资料来自网络 */ 用@InitBinder注解的控制器方法,允许你直接在你的控制器类中配置 Web 数据绑定.@InitBinder标记初始化WebDataBind

Oracle数据库以date类型保存日期时,Java中用哪个类对应数据库的date类型?

1. 使用JDBC操作Oracle数据库时,使用java.sql.Date类型对应数据库的date类型,此时只能保存和读取日期部分, 时间(时分秒)部分不能读取和保存:  查询结果集可以直接获取Date类型的数据:java.sql.Date date=resultSet.getDate("dateTime"): java.sql.Date类型的数据也可以直接保存到数据库或者与数据库中date类型的数据直接比较大小: 字符串的日期,则用SQL语句的转换函数 to_date('2017-4

含有Date类型的对象或集合转换成json时的问题

当我们把含有Date类型的对象或者集合直接转换为json,传回前台的时候不会报错,但是前台显示的时候是两个Object,而不会显示正常的日期. 当我们进debug调试的时候不会发现有错误,但是在解析JSON的时候就会发现: 在转换为JSON的过程中把date对象分开转化,即:年.月.日.时.分.秒,每个都当成一个对象给转化了. 这时候我们就需要做一些转换了 下面给大家提供一些大神给出常规的解决方案: 一:流星焱雨给出的解决方案 二:jadethao给出的解决方案 而当我们基本只需要临时显示日期的

ES数据-MySql处理Date类型的数据导入处理

用ES的小伙伴们,相信大家都遇到过Mapping处理Date类型的数据头疼问题吧. 不用头疼了,我来给你提供一种解决方案: 1.Maping定义为: {  "mappings": {    "carecustomerlog_type_all": {      "properties": {        "ID": {          "type": "long"        }, 

前台提交数据的类型

MIME (Multipurpose Internet Mail Extensions) 是描述内容类型的互联网标准.Clients use this content type or media type header to select an appropriate viewer application for the type of data the header indicates.  数据接收方根据MIME type of content进行不同的解析. MIME 消息包含文本(text