Date.prototype.getTimezoneOffset

При реализации задачи таймера обратного отсчёта столкнулся с одним «сюрпризом», а именно методом getTimezoneOffset, который отдавал то 3 часа, то 4 часа разницы. Этим хотел бы и поделиться.

В данном случае погрешность setInterval настолько мала, что ей можно было пренебречь.
Реализация самой задачи:

(function init() { 	var date1 = new Date("Jan 1, 1970"), 		date2 = new Date("Jan 1, 1970"), 		timezoneOffset = new Date().getTimezoneOffset(), 		$days = $('.timestamp .days .number'), 		$hours = $('.timestamp .hours .number'), 		$minutes = $('.timestamp .minutes .number'); 	date1.setMinutes(-timezoneOffset); 	date2.setMinutes(-timezoneOffset); 	date2.setUTCSeconds(60); 	var timer = setInterval(function() { 		$days.text( parseInt(date2.getTime()/1000/60/60/24) ); 		$hours.text( date2.getUTCHours() ); 		$minutes.text( date2.getUTCMinutes() ); 		date2.setUTCSeconds( date2.getUTCSeconds()-1 ); 		if (date1.toUTCString() === date2.toUTCString()) { 			clearInterval(timer); 		} 	}, 1000) })() 

Вскоре обнаружил баг, когда в IE оставалось меньше часа, но в счётчике выводилось 1 час, в то время как в других браузерах — нормально.
Вся проблема оказалось в этом:

timezoneOffset = new Date().getTimezoneOffset(), 

Итак, попробуем получить смещений временной зоны:

new Date('1 Jan, 1970').getTimezoneOffset(); 

Получаем смещение в 240 минут;
В IE при выполнении того же кода мы получаем смещение по временной зоне уже в 3 часа.
Посмотрим что вернёт нам IE в случае года, близкого к текущему:

new Date('1 Jan, 2012').getTimezoneOffset(): //-240 new Date('1 Jan, 2011').getTimezoneOffset(); //-180 

Ошибка в коде возникала по причне того, что для кода

new Date("Jan 1, 1970"), 

мы получаем смещение на 3 часа, а для

new Date().getTimezoneOffset() 

уже на 4 часа.
Полагаю, что здесь учитывается то, чем занимается Россия в последнее время — перевод стрелок.
Какой же подход тут правилен: IE или других?

ссылка на оригинал статьи http://habrahabr.ru/post/212113/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *