我使用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.这是什么原因?时区 ?请告诉我如何解决这个问题。
答案 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