【问题标题】:How to prevent Javascript from applying local timezone to Date() object?如何防止 Javascript 将本地时区应用于 Date() 对象?
【发布时间】:2016-06-02 23:58:53
【问题描述】:

假设我创建了一个 Date() 对象并从纪元开始以毫秒为单位传递,如下所示:

var d = new Date(0);

然后:

console.log(d);

输出:

Wed Dec 31 1969 16:00:00 GMT-0800 (Pacific Standard Time)

如果我打电话给d.getHours(),输出是:

16

这在我的用例中是不可取的。

如何创建忽略用户本地时区/系统时钟设置的日期对象?我希望能够以毫秒为单位(从纪元时间开始)传递一个时间,并像用户始终使用 UTC 一样显示它,所以如果他们在 Windows 中更改系统时钟,它不会改变显示的内容。

【问题讨论】:

  • 简短的回答是你不能。但是您可以获得用户当前的 TZ 偏移量:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 或者,您可以将创建指定为 UTC:developer.mozilla.org/en/docs/Web/JavaScript/Reference/… 但是当您使用 toString() 日期时,它仍会显示本地 TZ 偏移量。
  • 谢谢,我只是从传递给 Date() 的原始毫秒长中减去了时区偏移量,并从中创建了一个日期,它按预期工作。如果你创建一个答案,我会勾选它
  • @Joey——你不必减去偏移量。这样做意味着内置的 toString 将附加偏移量并使其看起来日期是不同的时间。

标签: javascript date


【解决方案1】:

使用Date.toUTCString:

var d = new Date(0);
console.log(d.toUTCString());

【讨论】:

    【解决方案2】:

    var now = new Date();
    var utcDate = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDay(), 0, 0, 0));
    console.log(utcDate);

    【讨论】:

    • 2016 年 6 月 3 日 16:35 为我返回“2016-06-05T00:00:00.000Z”。
    【解决方案3】:

    如何创建忽略用户本地时区的日期对象

    日期的核心是 UTC 时间值。主机时区仅在创建时间值或输出值(getDate、getHours 等)时考虑。

    因此,如果您想为特定的 UTC 时间创建日期,请使用 UTC 方法,与输出相同。向 Date 构造函数提供单个数值时,它被视为自 1970-01-01T00:00:00Z 以来的毫秒数,UTC/GMT 也是如此。

    例如

    var d = new Date(0); // zero offset from epoch
    
    document.write(d.getUTCHours()) // 0
    
    // toISOString uses offset +00:00
    document.write('<br>' + d.toISOString()); // the ECMAScript epoch

    如果您想使用 UTC 值以特定格式格式化日期,请使用 UTC 方法,例如

    // Format Date to DD/MM/YYYY hh:mm UTC
    function formatDate(d) {
      function z(n){return (n<10?'0':'') + n;}  
      return d.getUTCFullYear() + '/' +
             z(d.getUTCMonth() + 1) + '/' +
             z(d.getUTCDate()) + ' ' +
             z(d.getUTCHours()) + ':' +
             z(d.getUTCMinutes()) + ' UTC';
    }
    
    document.write(formatDate(new Date()));

    因此,您可以使用自纪元以来的毫秒值创建日期,然后写出 UTC 值,每个人都会看到相同的日期和时间(但请确保时区是 +00:00)。

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 2011-04-14
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多