Search
Write a publication
Pull to refresh

Comments 4

Подход IE правильный, так как историчность смещения имеет значение.
Простите, но я не понимаю, что этот код вообще делает — такое ощущение, что он попросту недописан. Да и надеетесь на точность setInterval вы совершенно зря.

Правильный таймер должен работать как-то так, и getTimezoneOffset ему совершенно не нужен.
var basetime = new Date("Tue Feb 11 2014 13:48:52 GMT+0600").getTime(); // Время, на которое настроен таймер
var INTERVAL = 1000*60;
timer();

function timer() {
  var time = new Date().getTime() - basetime; // Переставить местами для обратного таймера.
  if (time < 0) ; // Таймер еще не стартовал - или уже закончился. Этот случай надо обработать отдельно, в соответствии с логикой программы.
  setTimeout(timer, INTERVAL - time % INTERVAL);
  time /= INTERVAL;
  $minutes.text(Math.floor(time));
  time /= 60;
  $hours.text(Math.floor(time));
  time /= 24;
  $days.text(Math.floor(time));
};


Вместо арифметики над time можно было бы использовать new Date(time) и его методы getUTCXxx, я лично не вижу в таком подходе каких-то особых преимуществ.

PS По поводу же вопроса, заданного в конце статьи — лично мне, как программисту на C#, поведение IE привычнее. Но по сути, правильным поведением обладают оба браузера. Просто замените getTimezoneOffset на toString и обратите внимание на последнюю часть даты. Если она соответствует результату getTimezoneOffset — то все верно.

PPS Такое ощущение,. что вы не знаете про конструкцию new Date(0)
UPD: Вариант для любителей сокращать число строк в программе:
var basetime = new Date("Tue Feb 11 2014 13:48:52 GMT+0600").getTime();
var INTERVAL = 1000*60;
timer();

function timer() {
  var time = new Date().getTime() - basetime;
  if (time < 0) ; // Таймер еще не стартовал - или уже закончился. Этот случай надо обработать отдельно, в соответствии с логикой программы.
  setTimeout(timer, INTERVAL - time % INTERVAL);
  $minutes.text(Math.floor(time /= INTERVAL));
  $hours.text(Math.floor(time /= 60));
  $days.text(Math.floor(time /= 24));
};

Полагаю, что здесь учитывается то, чем занимается Россия в последнее время — перевод стрелок.

Если у вас российская локаль, то скорее всего. И ИЕ ведёт себя правильно. Но вообще рассчитывать, что getTimezoneOffset() при двух последовательных вызовах в конструкциях типа new Date().getTimezoneOffset(); вернёт одно число нельзя вообще. Как минимум, между этими вызовами может произойти смена летнего времени на зимнее на компе пользователя, а то и смена часового пояса.
Sign up to leave a comment.

Articles