【问题标题】:Convert milliseconds into UTC date object with UTC Time Zone使用 UTC 时区将毫秒转换为 UTC 日期对象
【发布时间】:2017-11-07 10:57:40
【问题描述】:

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

【问题讨论】:

  • 你为什么要制作两个日期对象?要获取 UTC 日期字符串,请使用 tempDate.toUTCString()
  • @evolutionxbox - 实际上 tempDate.toUTCString() 将日期对象转换为字符串,将无法对其进行进一步的日期操作。

标签: javascript date utc milliseconds gmt


【解决方案1】:

引自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

【讨论】:

  • 需要内置解析器(从 ECMAScript 2015 开始?)才能正确解析相关的 toStringtoUTCString 方法生成的任何内容,但仅限每个实现。
【解决方案2】:

你说:

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

【讨论】:

    【解决方案3】:

    如果您从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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2021-03-12
      • 2021-10-03
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多