2012-08-31 241 views
6

我想測試一個網站的位置功能,爲了做這個測試我需要嘗試不同的時區。我得到了javascript代碼的時區,調用下面的函數:如何模擬瀏覽器的時區?

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

現在,因爲我在阿根廷這個函數返回給我180,我需要用不同的時區進行測試。有人知道如何做到這一點? 非常感謝!

+0

更改計算機上的時區。這就是瀏覽器獲取它的地方。 –

+2

你也可以用不同的TZ啓動你的瀏覽器:http://stackoverflow.com/questions/11453740/fake-time-zone-for-web-app-testing –

回答

16

接受的答案並不真正模擬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 
+0

根據你使用的庫,一些圖書館會想要「自己的方式」。並試圖用其他代碼「修復」這些庫可能會意外地破壞一些東西......尤其是那些使用[好萊塢原則](https://en.wikipedia.org/wiki/Inversion_of_control)的用戶。如果有[適當的開發人員工具]會更好(http://stackoverflow.com/questions/4976696/how-do-i-test-my-browser-timezone-dependent-application-againts-different-timezo#comment58949204_4976769)爲它.... – Pacerier

+0

答案對我來說是有道理的,但看着代碼,它可能會缺少聲明來保存原始版本,就像'var getTimezoneOffset = Date.prototype.getTimezoneOffset;' – mikeapr4

+0

Thanks @ mikeapr4,你是對的。我添加了缺失的任務。 –

-7

你可以使用這個函數。

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

    return new Date().getTimezoneOffset(); 
} 

哪裏DEBUG是設置在前面,以確定您是否正在測試或者不是一個變量。

然後在整個代碼中使用該函數,而不是Date對象上的方法。

+5

如果你使用庫,這不會有幫助像'MomentJS' - 你不能強迫它使用你的包裝函數。 –