使用UTC时区将毫秒转换为UTC日期对象

时间:2017-06-06 12:16:44

标签: javascript date utc milliseconds gmt

我正在尝试将毫秒转换为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日期对象?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你说:

  

时间重置为UTC时间,但时区仍然是GMT + 0530(印度标准时间)。有没有确定的射击方法将毫秒转换为UTC时区的UTC日期对象?

但我认为你误解了正在发生的事情。将数字传递给Date构造函数时,如:

new Date(1465171200000)

假设自ECMAScript纪元(1970-01-01T00:00:00Z)以来是毫秒,因此创建一个Date对象,并将该值作为其内部时间值。所以Date对象本身就是UTC。

当您将其写入字符串时,内部会根据主机时区设置生成人类可读日期字符串,这就是您查看GMT + 0530日期(即主机系统时区设置)的原因。 Date对象本身没有时区,它始终是UTC。

然后使用UTC值创建" local"使用日期:

new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), ...)

然后主机时区用于生成相当于" local"的UTC时间值。相关值的日期。您已经有效地从原始时间值中减去了时区偏移量,因此它现在代表了不同的时刻。你可以得到完全相同的结果:

var d = new Date(1465171200000);
d.setMinutes(d.getMintues() + d.getTimezoneOffset());

它只是更清楚地显示了正在发生的事情。请注意,ECMAScript时区偏移以分钟为单位,与UTC具有相反的意义,即它们对于东部为负( - ),对于西部为正(+)。因此,UTC + 05:30的偏移量表示为-330,您需要将其添加到" shift"一个日期而不是减去它。



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),针对每个客户端时区调整它意味着它代表具有不同时区偏移的每个客户的不同时刻。

答案 2 :(得分:1)

如果您从Date创建Number,则会考虑当地时区。但是如果你想看看时间戳对于校正UTC的小时数意味着什么,你可以使用这样的帮助:

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

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

    return value;
};

用法是:

var date = (1465171200000).toUTCDate();