2014-01-15 28 views
-2

如果用戶在他或她的計算機上禁用了「自動調整夏令時節省時間」,則需要使用javascript來獲取正確的timezoneOffset。如何獲取正確的getTimezoneOffset()

例如,如果我打開自動調整夏令時,我在六月獲得-420,在太平洋時區一月-480。
但是,如果我禁用自動調整夏令時,我得到-480一月和六月。

是否有任何方法來糾正這種行爲,以便即使自動調整DST時間,我也能得到預期的DST時間?

+3

這是不可能的事情。 – zerkms

+0

好吧,你可以問一個用戶。 – zerkms

+1

如果用戶爲了某個特定原因而做了這些操作,該怎麼辦? –

回答

0

這是我以前用過的一個功能(source),希望對你有所幫助。

function TimezoneDetect(){ 
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear()); 
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt 
    var intMonth; 
    var intHoursUtc; 
    var intHours; 
    var intDaysMultiplyBy; 

    //go through each month to find the lowest offset to account for DST 
    for (intMonth=0;intMonth < 12;intMonth++){ 
     //go to the next month 
     dtDate.setUTCMonth(dtDate.getUTCMonth() + 1); 

     //To ignore daylight saving time look for the lowest offset. 
     //Since, during DST, the clock moves forward, it'll be a bigger number. 
     if (intOffset > (dtDate.getTimezoneOffset() * (-1))){ 
      intOffset = (dtDate.getTimezoneOffset() * (-1)); 
     } 
    } 

    return intOffset; 
} 

要檢測DST不使用getTimezoneOffset使用這樣的:

var rightNow = new Date(); 
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0); 
var temp = jan1.toGMTString(); 
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1)); 
var std_time_offset = (jan1 - jan2)/(1000 * 60 * 60); 

var june1 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0); 
temp = june1.toGMTString(); 
var june2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1)); 
var daylight_time_offset = (june1 - june2)/(1000 * 60 * 60); 
var dst; 
if (std_time_offset == daylight_time_offset) { 
    dst = "0"; // daylight savings time is NOT observed 
} else { 
    dst = "1"; // daylight savings time is observed 
} 
+0

正如OP所述 - 用戶機器上的時區設置不正確。所以不知道如何依靠不可靠的數據可以產生垃圾以外的東西 – zerkms

+0

他沒有說時區是不正確的,他說「自動調整節能時間爲夏令時節省時間」被禁用。 – Roni

+0

與我所說的不同,但包含在「用戶友好」的短語中?如果你不知道時區名稱,你不知道什麼時候應用DST,如果你不知道它是否被關閉 - 你不能做出正確的決定,你可能只會猜測。 – zerkms