【问题标题】:How to mock the browser's timezone? [duplicate]如何模拟浏览器的时区? [复制]
【发布时间】:2012-08-26 14:07:45
【问题描述】:

我想测试网站中的位置功能,要进行此测试,我需要尝试不同的时区。我使用 javascript 代码获取时区,调用以下函数:

var offset = new Date().getTimezoneOffset();

现在这个函数返回给我 180 因为我在阿根廷,我需要使用不同的时区进行测试。有人知道怎么做吗? 非常感谢!!

【问题讨论】:

标签: javascript google-chrome browser mocking timezone


【解决方案1】:

接受的答案并没有真正模拟 Date.getTimezoneOffset 方法,而是希望您使用具有相同名称的不同方法。

它不适用于 Date 对象本身,正如 Carl Meyer 指出的那样,它不适用于 MomentJS 等库。

更好的方法是覆盖Date 原型上的getTimezoneOffset 方法,以便Date 的所有实例都有被覆盖的方法。

d = new Date(); // Mon Jul 13 2015 10:58:12 GMT+0200 (CEST)
alert(d.getTimezoneOffset()); // -120, My local "real" timezone.

// Save the original method.
var getTimezoneOffset = Date.prototype.getTimezoneOffset;

Date.prototype.getTimezoneOffset = function () {
    return 160;
}
// Now Date objects will have the mocked timezone offset
alert(d.getTimezoneOffset()); // 160, The mocked timezone.

// Now restore the method to its original version
Date.prototype.getTimezoneOffset = getTimezoneOffset;
alert(d.getTimezoneOffset()); // -120

【讨论】:

  • 根据您使用的库,一些库会希望以“他们的方式”来做。并且试图用额外的代码“修复”这些库可能会出乎意料地破坏事情......尤其是对于那些使用hollywood principle 的人。如果有proper developer tool 会更好....
  • 答案对我来说很有意义,但是看代码,可能缺少保存原始版本的语句,例如var getTimezoneOffset = Date.prototype.getTimezoneOffset;
  • 谢谢@mikeapr4,你是对的。我添加了缺失的作业。
  • 如果您使用的是 moment.js,这对我不起作用。相反,我使用momentjs.com/timezone/docs/#/using-timezones/… 获得了原始时区,然后使用momentjs.com/timezone/docs/#/using-timezones/default-timezone 设置它,并在测试结束时使用它来设置它。
【解决方案2】:

你可以为此使用一个函数。

function getTimezoneOffset() {
  if (DEBUG) {
    return 600; // for Australian Eastern Standard Time
  }

  return new Date().getTimezoneOffset();
}

DEBUG 是之前设置的变量,用于确定您是否在测试。

然后在整个代码中使用该函数,而不是 Date 对象上的方法。

【讨论】:

  • 如果您使用像 MomentJS 这样的库,这将无济于事——您不能强制它使用您的包装函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多