2014-01-15 3 views
-2

Мне нужно иметь возможность получить правильный часовой поясOffset с помощью javascript, если пользователь отключил «Автоматически настраивать часы времени для экономии времени» на своем компьютере.Как получить правильный getTimezoneOffset()

Например, если я включаю автоматическую настройку DST, я получаю -420 в июне и -480 в январе для тихоокеанского часового пояса.
Однако, если я отключен Автоматическая настройка DST, я получаю -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

Смежные вопросы