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

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时区。

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

节点js会将date转换为UTC,并将date视为服务器时区。 但是在浏览器中,我没有时间就得到正确的CSTdate。

例如:

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

date应为2017-03-07T00:00:00.000Z 。 但是节点js从这个date减去 UTC和+5:30之间的服务器时区差,并且date对象变成了2017-03-06T18:30:00.000Z

为什么上面的代码在浏览器中的Node js中performance不同? 任何解决方法?

编辑:

 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

浏览器输出

Wed Mar 08 2017 17:58:17 GMT + 0530(印度标准时间)

Wed Mar 08 2017 23:28:17 GMT + 0530(印度标准时间)

Node js行为和浏览器有区别。 服务器(本地)时间是17:58。

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

在创buildDate对象时(无论是在浏览器中还是在Node.js中),都会创build实例,并将date解释为当前时区的本地。 请参阅MDN文档中的第二个注释 。

如果您想立即使用UTC创builddate,则必须使用

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

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

另外需要注意的是,将date实例打印到控制台将导致date被表示为一个始终使用UTC的ISO时间戳。 您可能希望通过打印date.toString()date.toLocaleString()来检查date对象,这将显示当前时区中的date。

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表示的。

如果将其更改为yyyy-mm-ddThh:mm:ss.fffZ+|-hh:mm ,则会显示为2017-03-07T00:00:00.000+05:30


更新

我运行了和你一样的date和时区,在我的机器上没有显示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 

如果你想要完全相同的浏览器只需要通过调用toString方法如下所示将其转换为string。 那么你会得到正确的date,如你所料。

(new Date())。toString();