Вернувшись из короткого отпуска, обнаружил, что админ установил новую таймзону RTZ 2. В результате некоторые браузеры стали несколько странно работать с датами. Вот, например, как выглядит декабрь 2013 года в календаре jquery ui (достаточно старая версия):
То, что следует обновляться, сомнений не вызывает, но это корпоративная среда, и не все так просто.
Полез смотреть, что происходит, и увидел странные вещи. Начал с простейшего
В IE8 это вовсе не 1 января, как можно было бы подумать, а 31 декабря 2013! (проверьте в более старших версиях).
Но к своеобразному поведению IE все давно привыкли, а скриншот, показанный выше, снят в хроме, результаты выполнения те же самые.
Ну хорошо, а что же делать с календарем? Если порыться в исходниках, то причина указанной картинки — неправильное определение количества дней в месяце. Приведенный ниже код для декабря в хроме и IE возвращает 1!
Пока заменил на такое, вроде, работает:
Также неправильно работают сеттеры. Например, и в хроме, и в IE указанный код дает удивительные результаты:
В опере и файрфоксе неприятностей пока не обнаружил. Кроме того, в последней версии jquery ui декабрь 2013 отображается нормально. Тем не менее, теперь придется проверять скрипты на предмет наличия 1 января 2014.
Как вы боретесь с этой проблемой?
UPD
Пока не опубликованы исправленные версии браузеров, можно исправить непосредственно календарь в jquery ui.
— если используется старая версия, то необходимо поменять функцию определения количества дней в месяце:
Кроме того, необходимо изменить функцию вычисления дня недели первого дня месяца, добавив к дате хотя бы 1 час (4-й аргумент):
Без данного исправления неправильно отображается январь 2014 — как будто он начался во вторник.
То, что следует обновляться, сомнений не вызывает, но это корпоративная среда, и не все так просто.
Полез смотреть, что происходит, и увидел странные вещи. Начал с простейшего
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 — как будто он начался во вторник.