你说:
时间被重置为UTC时间,但时区仍然来为GMT + 0530(印度标准时间)。是否有任何确定的镜头方法将毫秒转换为UTC时区的UTC日期对象?
但我想你误解了正在发生的事情。当通过一个号码到Date构造为:
new Date(1465171200000)
是它假定为由于ECMAScript的划时代毫秒(1970-01-01T00:00:00Z),所以一个日期对象与值创建作为其内部时间值。所以Date对象本质上是UTC。
当你写一个字符串,内部人类可读的日期字符串是基于主机的时区设置,这就是为什么你看到GMT + 0530的日期(也就是您的主机系统时区设置)生成。 Date对象本身没有时区,它始终是UTC。
然后,当您使用UTC值来创建一个使用“本地”日期:
new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), ...)
那么主机时区用于生成相当于为相关的值“本地”日期UTC时间值。您已经从原始时间值中有效地减去了您的时区偏移量,因此它现在代表了不同的时间。你可以得到完全相同的结果:
var d = new Date(1465171200000);
d.setMinutes(d.getMintues() + d.getTimezoneOffset());
这只是显示了一些更清楚发生了什么事情。请注意,ECMAScript时区偏移以分钟为单位,与UTC有相反的意义,也就是说,它们对于东为负( - ),对于西为正(+)。因此UTC + 05:30的偏移量表示为-330,您需要将其添加到“移位”日期而不是减去它。
var tempDate = new Date(1465171200000);
var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(), tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds());
console.log('Direct conversion to Date\ntempDate: ' + tempDate.toString());
console.log('Adjusted using UTC methods\n_utcDate: ' + _utcDate.toString());
tempDate.setMinutes(tempDate.getMinutes() + tempDate.getTimezoneOffset());
console.log('Adjusted using timezoneOffset\ntempDate: ' + tempDate.toString());
不过,我不明白你为什么要做到以上。 1465171200000
代表特定的时间(2016-06-06T00:00:00Z),对每个客户端时区进行调整意味着它代表不同时间点的每个客户端使用不同的时区偏移量。
你为什么做两个日期对象?要获取UTC日期字符串,请使用'tempDate.toUTCString()' – evolutionxbox
@evolutionxbox - 其实tempDate.toUTCString()将日期对象转换为字符串,将无法对其进行进一步的日期操作。 –