【问题标题】:Setting timezone in MomentJS在 MomentJS 中设置时区
【发布时间】:2016-02-13 14:16:38
【问题描述】:

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

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

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

而且效果很好。

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

【问题讨论】:

  • 这听起来不是个好主意。 Date 实例的实际时区偏移量仍然是它从主机系统获得的任何内容,但是当您尝试读取它时,您将获得 120(分钟),相当于 UTC-02:00。要获取其他时区的时间,moment.js 应该使用 UTC 方法并应用适当的偏移量,但您需要查看源以确定这一点。
  • 那么我应该使用 TimeShift.js 吗?

标签: javascript datetime timezone momentjs angularjs-e2e


【解决方案1】:

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

上图可以看到,尽管改变了偏移函数,但日期仍然使用太平洋时间。

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

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

但是:

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

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

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

  • 偏移量不是时区。时区可以为夏令时切换偏移量,以及其他历史和政治原因。阅读the timezone tag wiki 中的“时区!= 偏移量”。如果您的意图是设置时区,那么您应该使用moment-timezone 插件,并执行以下操作:

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

【讨论】:

  • 我可以只使用没有momentjs的moment-timezone吗?我的意思是,只是为了将时区设置为固定的。
  • 不,这样不行。时刻时区扩展时刻。你两个都需要。
  • 不错的答案+证明!谢谢
猜你喜欢
  • 1970-01-01
  • 2016-01-30
  • 2021-11-22
  • 2015-05-21
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多