2017-06-06 195 views
1

我试图毫秒为UTC日期对象转换如下 -转换毫秒与UTC时区UTC日期对象

var tempDate = new Date(1465171200000); 
// --> tempDate = Mon Jun 06 2016 05:30:00 **GMT+0530 (India Standard Time)** {} 

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(), tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds()); 
//--> _utcDate = Mon Jun 06 2016 00:00:00 **GMT+0530 (India Standard Time)** {} 

时间被重置为UTC时间,但时区仍然来为GMT + 0530(印度标准时间)。 是否有任何确定的镜头方法将UTC时区转换为UTC日期对象的毫秒数?

+0

你为什么做两个日期对象?要获取UTC日期字符串,请使用'tempDate.toUTCString()' – evolutionxbox

+0

@evolutionxbox - 其实tempDate.toUTCString()将日期对象转换为字符串,将无法对其进行进一步的日期操作。 –

回答

2

this answer引用(我建议你完全读):

有存储在Date对象本身没有时区或字符串格式。使用Date对象的各种功能时,计算机的本地时区应用于内部表示。

由于时区未存储在Date对象中,因此无法对其进行设置。

我看到两个选项:

第一是利用图书馆的(如在回答表明以上)。颇为流行的现在是Moment.js

第二(纯JavaScript - 如果它在你的背景下,可行的解决方案):

做了“时间的数学”在您的本地时区。

当您准备切换到UTC时,使用toUTCString()方法。

当然,你会最终有一个字符串,因为这让你只要保存时区的日期时间值。

从现在起,您将无法将日期时间作为Date对象进行操作,这必定是最后一步。

var tempDate = new Date(1465171200000); 
// Mon Jun 06 2016 05:30:00 GMT+0530 

// Do your date time math here 
// using the Date object's methods 

var utcDateAsString = tempDate.toUTCString(); 
// Mon Jun 06 2016 00:00:00 GMT 
+0

内置分析器要求(如2015年的ECMAScript的?)正确解析任何相关的*的toString *和* toUTCString *方法产生,但只有每实现。 – RobG

1

你说:

时间被重置为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),对每个客户端时区进行调整意味着它代表不同时间点的每个客户端使用不同的时区偏移量。

1

如果创建从一个NumberDate,当地时区是一个考虑。但是,如果你想看到什么样的时间戳将与UTC校正时间的意思是,你可以使用一个辅助这样:

Number.prototype.toUTCDate = function() { 
    var value = new Date(this); 

    value.setHours(value.getHours() - (value.getTimezoneOffset()/60)); 

    return value; 
}; 

的用法是:

var date = (1465171200000).toUTCDate();