使用NodeJS在mysql中正确保存日期(比实际日期少一天)

时间:2016-07-26 07:00:59

标签: mysql sql node.js date express

我使用Node.JS和ExpressJS创建了rest服务器。数据库是MySQL。 我从前端传递如下日期。

  

2016年7月26日

当我进入数据库时​​,它会像这样保存。如下:

  

2016-07-26 00:00:00

因为mysql日期格式是时间戳。当我从REST ruls中获取结果时,我会得到这样的日期。

  

“2016-07-25T18:30:00.000Z”

我救了26.但在这里我得到25.这是什么原因?时区 ?请告诉我如何解决这个问题。

7 个答案:

答案 0 :(得分:1)

通过将连接选项设置为

dateStrings:['DATE','DATETIME']

为我工作!

答案 1 :(得分:1)

问题与保存数据或SQL本身无关;因为如果直接在数据库上运行查询,它将显示保存的正确值。

您可以在每个查询中通过在SQL端添加日期(如某些答案所建议的那样)来解决此问题;但这不是正确的解决方案。

另一种选择是通过添加值来修复在node.js中;这也不是正确的方法。

据我了解,通过在初始化mysql连接时设置时区来实现此目的的正确方法。

var connection = mysql.createConnection({
    host: '192.99.99.99',
    user: 'user',
    password: 'password',
    database: 'mydb',
    timezone: 'utc' //<-- here
  });

答案 2 :(得分:0)

这是因为节点将日期转换为ISOString,日期是GMT。 从数据库中查询数据后,使用 .toLocaleString();

示例:

  

connection.query(yourDbQuery,function(err,result){if(result){
  var date = result.date.toLocaleString(); }});

您也可以安装npm时刻,这对日期非常有用。

安装,使用

  

npm安装时刻

并使用以下代码:

  

var moment = require(&#39; moment&#39;); date =   矩(result.date).format(&#39; DD / MM / YYYY&#39);

答案 3 :(得分:0)

在我的例子中,.toLocalString()返回相同的iSOString格式。所以,我使用自己的coaded函数将iSOString时间转换为任何格式(在本例中为UTC格式)。

例如:2018-02-09T12:18:23.000Z =&gt; 2018-02-09 12:18:23

以下是我获取UTC日期格式的方式:

var date = date_formate(new Date(result[0].date), "yyyy-MM-dd HH:mm:ss");

在您的代码中包含以下自定义功能。

function date_formate (date, format, utc) {
    var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var MMM = ["\x01", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var dddd = ["\x02", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var ddd = ["\x03", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

    var y = utc ? date.getUTCFullYear() : date.getFullYear();
    format = format.replace(/(^|[^\\])yyyy+/g, "$1" + y);
    format = format.replace(/(^|[^\\])yy/g, "$1" + y.toString().substr(2, 2));
    format = format.replace(/(^|[^\\])y/g, "$1" + y);

    var M = (utc ? date.getUTCMonth() : date.getMonth()) + 1;
    format = format.replace(/(^|[^\\])MMMM+/g, "$1" + MMMM[0]);
    format = format.replace(/(^|[^\\])MMM/g, "$1" + MMM[0]);
    format = format.replace(/(^|[^\\])MM/g, "$1" + this.pad(M, 2));
    format = format.replace(/(^|[^\\])M/g, "$1" + M);

    var d = utc ? date.getUTCDate() : date.getDate();
    format = format.replace(/(^|[^\\])dddd+/g, "$1" + dddd[0]);
    format = format.replace(/(^|[^\\])ddd/g, "$1" + ddd[0]);
    format = format.replace(/(^|[^\\])dd/g, "$1" + this.pad(d, 2));
    format = format.replace(/(^|[^\\])d/g, "$1" + d);

    var H = utc ? date.getUTCHours() : date.getHours();
    format = format.replace(/(^|[^\\])HH+/g, "$1" + this.pad(H, 2));
    format = format.replace(/(^|[^\\])H/g, "$1" + H);

    var h = H > 12 ? H - 12 : H == 0 ? 12 : H;
    format = format.replace(/(^|[^\\])hh+/g, "$1" + this.pad(h, 2));
    format = format.replace(/(^|[^\\])h/g, "$1" + h);

    var m = utc ? date.getUTCMinutes() : date.getMinutes();
    format = format.replace(/(^|[^\\])mm+/g, "$1" + this.pad(m, 2));
    format = format.replace(/(^|[^\\])m/g, "$1" + m);

    var s = utc ? date.getUTCSeconds() : date.getSeconds();
    format = format.replace(/(^|[^\\])ss+/g, "$1" + this.pad(s, 2));
    format = format.replace(/(^|[^\\])s/g, "$1" + s);

    var f = utc ? date.getUTCMilliseconds() : date.getMilliseconds();
    format = format.replace(/(^|[^\\])fff+/g, "$1" + this.pad(f, 3));
    f = Math.round(f / 10);
    format = format.replace(/(^|[^\\])ff/g, "$1" + this.pad(f, 2));
    f = Math.round(f / 10);
    format = format.replace(/(^|[^\\])f/g, "$1" + f);

    var T = H < 12 ? "AM" : "PM";
    format = format.replace(/(^|[^\\])TT+/g, "$1" + T);
    format = format.replace(/(^|[^\\])T/g, "$1" + T.charAt(0));

    var t = T.toLowerCase();
    format = format.replace(/(^|[^\\])tt+/g, "$1" + t);
    format = format.replace(/(^|[^\\])t/g, "$1" + t.charAt(0));

    var tz = -date.getTimezoneOffset();
    var K = utc || !tz ? "Z" : tz > 0 ? "+" : "-";
    if (!utc) {
        tz = Math.abs(tz);
        var tzHrs = Math.floor(tz / 60);
        var tzMin = tz % 60;
        K += this.pad(tzHrs, 2) + ":" + this.pad(tzMin, 2);
    }
    format = format.replace(/(^|[^\\])K/g, "$1" + K);

    var day = (utc ? date.getUTCDay() : date.getDay()) + 1;
    format = format.replace(new RegExp(dddd[0], "g"), dddd[day]);
    format = format.replace(new RegExp(ddd[0], "g"), ddd[day]);

    format = format.replace(new RegExp(MMMM[0], "g"), MMMM[M]);
    format = format.replace(new RegExp(MMM[0], "g"), MMM[M]);

    format = format.replace(/\\(.)/g, "$1");

    return format;
}

答案 4 :(得分:0)

这是因为JS将根据客户端时区更新任何日期。 因此,我在npm库下面使用它来更新来自API和SQL的任何Date对象,如下所示:

import { framework, libs } from 'saffroncodejs';//For react
import { framework, libs } from 'saffroncodejs-pure';//For NodeJS

...
//result.data.result = {any:1,item:2,haveDates:{any:2,date:"2016-07-25T18:30:00.000Z"}}

libs.JSFunctions.correctDates(result.data.result);

//>> result.data.result = {any:1,item:2,haveDates:{any:2,date:"2016-07-26T00:00:00.000Z"}}

https://www.npmjs.com/package/saffroncodejs

您可以在其中找到纯js脚本: https://github.com/SaffronCode/SaffronCodeJS/blob/master/src/libs/JSFunctions.ts

答案 5 :(得分:0)

我有类似的问题,但是在从数据库中获取数据时。日期向后移了一天。 因此,要解决此问题。我在查询本身中格式化了日期。

DATE_FORMAT(date_time, "%Y-%m-%d")

例如:-问题:

查询:     从tbl中选择百分比DATE(date_time)作为日期;

输出:

[{
   percentage: 3,
   date: "2019-06-11T18:30:00.000Z"
 }]

解决方案:

查询:     从tbl中选择百分比DATE_FORMAT(date_time,“%Y-%m-%d”)作为日期; 输出:

[{
   percentage: 3,
   date: "2019-06-12"
}]

答案 6 :(得分:0)

就我而言,原始日期:1/1/2020,数据库输出:12/31/2019。 这个简单的技巧奏效了

var date = 'result from mysql';
date = date.setDate(date.getDate()+1);
console.log(date); // 1/1/2020