Pull to refresh

Новая таймзона — новые проблемы

Reading time2 min
Views16K
Вернувшись из короткого отпуска, обнаружил, что админ установил новую таймзону RTZ 2. В результате некоторые браузеры стали несколько странно работать с датами. Вот, например, как выглядит декабрь 2013 года в календаре jquery ui (достаточно старая версия):



То, что следует обновляться, сомнений не вызывает, но это корпоративная среда, и не все так просто.
Полез смотреть, что происходит, и увидел странные вещи. Начал с простейшего

  var date = new Date(2014,0,1)

В IE8 это вовсе не 1 января, как можно было бы подумать, а 31 декабря 2013! (проверьте в более старших версиях).
Но к своеобразному поведению IE все давно привыкли, а скриншот, показанный выше, снят в хроме, результаты выполнения те же самые.
Ну хорошо, а что же делать с календарем? Если порыться в исходниках, то причина указанной картинки — неправильное определение количества дней в месяце. Приведенный ниже код для декабря в хроме и IE возвращает 1!
return 32 - new Date(year, month, 32).getDate();

Пока заменил на такое, вроде, работает:
return new Date(year, month+1, 0).getDate();

Также неправильно работают сеттеры. Например, и в хроме, и в IE указанный код дает удивительные результаты:
var date = new Date(2014,0,2);
date.setDate(1);

В опере и файрфоксе неприятностей пока не обнаружил. Кроме того, в последней версии jquery ui декабрь 2013 отображается нормально. Тем не менее, теперь придется проверять скрипты на предмет наличия 1 января 2014.

Как вы боретесь с этой проблемой?

UPD
Пока не опубликованы исправленные версии браузеров, можно исправить непосредственно календарь в jquery ui.
— если используется старая версия, то необходимо поменять функцию определения количества дней в месяце:
    /* Find the number of days in a given month. */
    _getDaysInMonth: function(year, month) {
        return new Date(year, month+1, 0).getDate();
    },

Кроме того, необходимо изменить функцию вычисления дня недели первого дня месяца, добавив к дате хотя бы 1 час (4-й аргумент):
    /* Find the day of the week of the first of a month. */
    _getFirstDayOfMonth: function(year, month) {
        return new Date(year, month, 1, 1).getDay();
    },

Без данного исправления неправильно отображается январь 2014 — как будто он начался во вторник.
Tags:
Hubs:
Total votes 29: ↑22 and ↓7+15
Comments11

Articles