节点 js 中的 new Date(year, month, date) 自动转换为 UTC 时区

Ash*_*ena 5 javascript date iso8601 node.js

    var dateInCST; //Getting CST date as input.

    /*Triming the time part and retaining only the date.*/
    var onlyDateInCST = new Date(dateInCST.getUTCFullYear(), dateInCST.getUTCMonth(), dateInCST.getUTCDate()); 

    console.log(onlyDateInCST);
Run Code Online (Sandbox Code Playgroud)

我在 +5:30 即 IST 时区。

在通过提供年月日创建日期的过程中,节点 js 将其视为 IST 并自动扣除 -5:30。

Node js 通过将日期视为服务器时区来自动将日期转换为 UTC。但是在浏览器中,我没有时间就获得了正确的 CST 日期。

例子 :

var today = new Date(2017, 2, 7);
console.log(today);
Run Code Online (Sandbox Code Playgroud)

日期应该是2017-03-07T00:00:00.000Z。但是节点js从这个日期扣除UTC之间的服务器时区差异,即+5:30,日期对象变成2017-03-06T18:30:00.000Z

为什么上面的代码在 Node js 和浏览器中的表现不同。有什么解决方法吗?

编辑 :

var date = new Date();
function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
console.log(date);
console.log(createDateAsUTC(date));
Run Code Online (Sandbox Code Playgroud)

NodeJs 输出

2017-03-08T12:28:16.381Z

2017-03-08T17:58:16.000Z

浏览器输出

2017 年 3 月 8 日星期三 17:58:17 GMT+0530(印度标准时间)

2017 年 3 月 8 日星期三 23:28:17 GMT+0530(印度标准时间)

Node js 行为和浏览器之间存在差异。服务器(本地)时间是 17:58。

new Date(?,?,?,?,?,?) 和 new Date(Date.UTC(?,?,?,?,?,?)) 有什么区别?

Pav*_*ala 5

Nodejs 以ISO 8601格式表示

Z 是零 UTC 偏移的区域指示符。“09:30 UTC”因此表示为“09:30Z”或“0930Z”

在你的情况下

var 今天 = 新日期(2017, 2, 7);

2017-03-06T18:30:00.000Z 它是有效的,因为它以 UTC 表示。

可能是 nodejs 中的默认日期格式是yyyy-mm-ddThh:mm:ss.fffZ,如果将其更改为yyyy-mm-ddThh:mm:ss.fffZ+|-hh:mm它将显示为2017-03-07T00:00:00.000+05:30


更新

我运行的日期和时区与你的相同,在我的机器上它没有显示 ISO 8601 格式,它只显示了toISOString()方法

var today = new Date(2017, 2, 7);
console.log(today); --> Tue Mar 07 2017 00:00:00 GMT+0530 (India Standard Time)
console.log(today.toISOString()); --> 2017-03-06T18:30:00.000Z
Run Code Online (Sandbox Code Playgroud)

复制我添加 moment.js

var today = new Date(2017, 2, 7);
console.log(moment(today).format()); --------> 2017-03-07T00:00:00+05:30
console.log(moment(today).utc().format()); --> 2017-03-06T18:30:00Z
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您想要与浏览器中的完全相同,只需通过调用如下所示的 toString 方法将其转换为字符串。然后你会得到你预期的正确日期。

(新日期()).toString();