Neue Zeitzone - neue Probleme

    Nach einer kurzen Urlaubsreise stellte ich fest, dass der Administrator eine neue Zeitzone RTZ 2 eingestellt hatte. Infolgedessen begannen einige Browser, etwas seltsam mit Datumsangaben umzugehen. So sieht beispielsweise Dezember 2013 im jquery ui-Kalender aus (eine ziemlich alte Version):



    Es besteht kein Zweifel, dass es aktualisiert werden sollte, aber dies ist eine Unternehmensumgebung, und es ist nicht so einfach.
    Es war nützlich zu beobachten, was geschah, und ich sah seltsame Dinge. Begonnen mit dem einfachsten

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

    In IE8 ist dies nicht der 1. Januar, wie Sie vielleicht denken, sondern der 31. Dezember 2013! (ältere Versionen einchecken).
    Aber jeder ist schon lange an das eigentümliche Verhalten des Internet Explorers gewöhnt, und der oben gezeigte Screenshot wurde in Chrom aufgenommen, die Ergebnisse sind die gleichen.
    Was tun mit dem Kalender? Wenn Sie in der Quelle stöbern, ist der Grund für das angegebene Bild eine falsche Bestimmung der Anzahl der Tage in einem Monat. Der Code unten für Dezember in Chrome und IE gibt 1 zurück!
    return 32 - new Date(year, month, 32).getDate();
    

    Bisher habe ich es durch dieses ersetzt, anscheinend funktioniert es:
    return new Date(year, month+1, 0).getDate();
    

    Setter funktionieren auch falsch. Beispielsweise liefert der angegebene Code sowohl in Chrome als auch im IE erstaunliche Ergebnisse:
    var date = new Date(2014,0,2);
    date.setDate(1);
    

    Ich habe noch keine Probleme mit Oper und Firefox gefunden. Außerdem wird in der neuesten Version von jquery ui der Dezember 2013 normal angezeigt. Jetzt müssen Sie jedoch die Verfügbarkeit der Skripte am 1. Januar 2014 überprüfen.

    Wie gehen Sie mit diesem Problem um?

    UPD
    Bis gepatchte Browserversionen veröffentlicht sind, können Sie den Kalender direkt in jquery ui reparieren.
    - Wenn die alte Version verwendet wird, muss die Funktion zur Ermittlung der Anzahl der Tage pro Monat geändert werden:
        /* Find the number of days in a given month. */
        _getDaysInMonth: function(year, month) {
            return new Date(year, month+1, 0).getDate();
        },
    

    Außerdem muss die Funktion zur Berechnung des Wochentags des ersten Tages des Monats geändert werden, wobei dem Datum mindestens 1 Stunde hinzuzufügen ist (4. Argument):
        /* Find the day of the week of the first of a month. */
        _getFirstDayOfMonth: function(year, month) {
            return new Date(year, month, 1, 1).getDay();
        },
    

    Ohne diesen Fix wird der Januar 2014 nicht richtig angezeigt - als ob er am Dienstag begonnen hätte.

    Jetzt auch beliebt: