使用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日期对象?
从这个答案引用(我建议你完全阅读):
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
你说:
时间重置为UTC时间,但时区仍为GMT + 0530(印度标准时间)。 是否有任何确定的镜头方法将毫秒转换为UTC时区的UTC日期对象?
但我认为你误解了正在发生的事情。 当您将一个数字传递给Date构造函数时,如下所示:
new Date(1465171200000)
自ECMAScript时代(1970-01-01T00:00:00Z)以来它被假定为毫秒,因此Date对象是使用该值作为其内部时间值创建的。 所以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 DatentempDate: ' + tempDate.toString());
console.log('Adjusted using UTC methodsn_utcDate: ' + _utcDate.toString());
tempDate.setMinutes(tempDate.getMinutes() + tempDate.getTimezoneOffset());
console.log('Adjusted using timezoneOffsetntempDate: ' + tempDate.toString());
如果您从Number
创建Date
,则考虑使用本地时区。 但是,如果您想查看UTC时间校正的小时数将意味着什么,则可以使用助手:
Number.prototype.toUTCDate = function () {
var value = new Date(this);
value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));
return value;
};
用法是:
var date = (1465171200000).toUTCDate();
链接地址: http://www.djcxy.com/p/46593.html
上一篇: Convert milliseconds into UTC date object with UTC Time Zone
下一篇: Date picker returning dateTime with time zone in VueJS Element Library