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

    Вернувшись из короткого отпуска, обнаружил, что админ установил новую таймзону 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 — как будто он начался во вторник.
    Share post

    Comments 11

      +8
      Где-то видел уже подобное…
      UPD: Хром, укравший рождество.
        +1
        Да, это действительно оно. Только автор заглядывал в будущее, а я в прошлое :). Тем не менее, приведенный патч
        return new Date(year, month+1, 0).getDate();
        

        поможет и в будущем (как видно по картинке в той статье, это c большой вероятностью тоже календарь из jquery ui)
      • UFO just landed and posted this here
          0
          Это радует.
          Что касается правильности работы нового jquery ui, я поторопился. Откройте ссылку в хроме или IE, и там — январь 2014. В правильных браузерах (да и в бумажном календаре) январь 2014 должен начинаться в среду. Меня сбило с толку, что декабрь 2013 он показывает правильно )
          0
          Каким-то образом отразилось и на Firefox. 26 октября выводится 2 раза (запись к врачу на портале pgu.mos.ru):

          Тот же datepicker из jquery ui, на этот раз в FF 33.0
            0
            А где именно так на PGU? а то нашёл там два календарика и оба нормально:


            Окружение: Win10, FF 33

            ЗЫ: первый из «Запись в детский сад», а второй из профиля
              0
              выбор врача по времени приема, размер уменьшил в 2 раза:

              В хроме то же самое
                0
                в FF нормально показывается (так же, как на левом календарике из скрина). В хроме не проверял — не установлен.
                может ещё от ОС зависит?
                  0
                  Не только от ОС, но и от факта установки апдейта KB2998527. Win10 по ссылке нет, и не удивительно — систему анонсировали позже. А в принципе, таймзона RTZ есть в Win10?
                    0
                    в списке только UTC таймзоны.
            0
            Вот нашел решение для подобных проблем, автор утверждает что должно помочь. Это патч на JavaScript который нужно применить до загрузки каких либо скриптов работающих с датой и временем. При этом отпадет необходимость делать правки в старых скриптах.

            Only users with full accounts can post comments. Log in, please.