我如何获得正确的getTimezoneOffset()

时间:2014-01-15 21:10:32

标签: javascript jquery

我需要能够通过使用javascript来获取正确的timezoneOffset,如果用户已禁用"自动调整Daylight节省时间的时间时间"在他或她的电脑上。

例如,如果我自动开启调整DST,我将在6月获得-420,在1月份为-480获得太平洋时区。
但是,如果我禁用自动调整DST,我会在1月和6月获得-480。

有没有办法纠正这种行为,以便即使自动调整DST时间,我也能获得预期的DST?

1 个答案:

答案 0 :(得分: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;
}

要在不使用getTimezoneOffset的情况下检测DST,请使用此选项:

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
}