使用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