节点js中的新日期(年,月,日)自动转换为UTC时区

问题描述 投票:3回答:5
    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);

我在+5:30,即IST时区。

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

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

示例:

var today = new Date(2017, 2, 7);
console.log(today);

日期应为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));

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。

新日期(?,?,?,?,?,?)和新日期(Date.UTC(?,?,?,?,?,?))之间有什么区别?

javascript node.js date iso8601
5个回答
3
投票

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

(new Date())。toString();


2
投票

Nodejs以ISO 8601格式表示

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

在你的情况下

var today = new Date(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

复制我添加了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

1
投票

当您创建Date对象(无论是在浏览器中还是在Node.js中)时,将创建实例,并将日期解释为当前时区的本地。见second note in MDN docs

如果您想立即以UTC格式创建日期,则必须使用

new Date(Date.UTC(...))

Date.UTC()new Date()具有相同的输入语义。

此处需要注意的另一件事是将日期实例打印到控制台将导致日期表示为ISO时间戳,该时间戳始终为UTC。您可能希望通过打印date.toString()date.toLocaleString()来检查日期对象,var date= new Date("2019-2-21 UTC") var d = new Date(); var date = new Date(d + 'UTC'); console.log(d)// date in UTC console.log(date)// date in localtime 将在当前时区显示日期。


0
投票

您可以在新Date()中传递的日期字符串末尾附加字符串“UTC”,例如:

const test = new Date();
const test1 = new Date(test.setUTCHours(0,0,0,0));

现在var日期将在当地时间

qazxswpoi

`


0
投票
qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.