在 MomentJS 中设置时区

Setting timezone in MomentJS

我为 JavaScript SPA 应用程序编写了一些测试代码。我为整个 SPA 设置了语言环境,假装 运行 它在世界的不同地方。

现在,我设置了覆盖 Date() 的 getTimezoneOffset() 函数的语言环境 class:

Date.prototype.getTimezoneOffset = function () { return 120 };

而且效果很好。

但是,在 SPA 的某些部分,我使用的是 MomentJS(由于标准 DateTime 库的某些限制)。覆盖是否也会影响 MomentJS 语言环境?还是不行?

您不应覆盖 Date 对象的 getTimezoneOffset 函数。这实际上不会像您期望的那样工作。它只会改变偏移量通过 getTimezoneOffset 公开的方式,它不会改变 Date 对象本身的行为,或者它具有的其他功能。

上面可以看到,虽然改变了offset函数,但是日期还是使用太平洋时间。

就 moment.js 而言,您当然 可以 设置矩对象的偏移量,使用 utcOffset 函数。

var m = moment();
var o = m.utcOffset();  // returns the current offset
m.utcOffset(-120);      // sets a different offset

但是:

  • 偏移量将具有符合 ISO8601 标准的符号,正值是 UTC 的 east。 JavaScript 的 getTimezoneOffset 具有正值 west UTC。

  • 改变偏移量只会改变 moment 本身产生的值,例如 format 函数和其他各种函数。它不会及时更改基础时刻,因此如果您调用 .toDate() 来获取 Date 对象,该对象将具有原始系统时区。

  • Date对象不能被骗到其他时区工作。您可能遇到的任何尝试将时间偏移偏移量的方法都是有缺陷的,并且在一些极端情况下会失败。

  • 偏移量不是时区。时区可以根据夏令时以及其他历史和政治原因切换偏移量。阅读 the timezone tag wiki. If your intent was to set a time zone, then you should use the moment-timezone 插件中的 "Time Zone != Offset",然后执行以下操作:

    moment().tz('America/New_York')
    
  • 您问过您现有的覆盖是否会搞砸 moment.js - 是的。 moment 使用 getTimezoneOffset 函数并期望它保持不变。