Salut ! Je vous glisse rapidement ce bout de code que j'utilise beaucoup. Je l'ai adapté pour qu'il soit indépendant de toute bibliothèque tierce, même si vous pourrez reconnaître certains traits... Bref, ça s'utilise simplement; voici qq exemples :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
new Date().shift(+1); // demain (à la même heure)
Date.today().shift(-1); // hier (à midi)
Date().today().shift(+1, Date.Month); // dans un mois
Date.parse("2010-02-01").shift(+1, Date.Month).shift(-1); // le dernier jour de février 2010
Un cas un peu plus concrêt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
var valid = true;
 
// ...
// ...
// valid &= ...
 
// La date d'expiration est-elle passée ?
var month = "11"; // pouvant provenir d'un champ
var year = "2009"; // idem
var expiry = Date.parse(year + "-" + month + "01");
// Positionnons "expiry" à la fin du mois.
expiry = expiry.shift(+1, Date.Month).shift(-1);
valid &= !(Date.today() > expiry);
Voilà le code (mes excuses pour le manque de commentaires; heureusement ça s'explique assez bien tout seul, non ? ) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
(function() {
    function extend(destination, source) {
        for(var property in source) { destination[property] = source[property]; }
        return destination;
    }
 
    extend(Object, { extend: extend });
})();
 
 
 
Object.extend(Date, {
    Day: {
        duration: 86.4e6 /* 1000 * 60 * 60 * 24 */
    },
 
    Month: {
        getDaysCount: function(date) {
            var reference = new Date(date.getTime());
            while(reference.getMonth() == date.getMonth()) {
                reference.setTime(reference.getTime() + Date.Day.duration);
            }
 
            return new Date(reference.getTime() - Date.Day.duration).getDate();
        }
    },
 
    Year: {
        getDaysCount: function(date) {
            var first = new Date(date.getFullYear(), 0, 1);
            var reference = new Date(first);
            while(reference.getFullYear() == date.getFullYear()) {
                reference.setTime(reference.getTime() + Date.Day.duration);
            }
 
            return (reference.getTime() - first.getTime()) / Date.Day.duration;
        }
    },
 
    /** @function ? Returns the date of today at noon. */
    today: function() {
        var today = new Date();
        today.setHours(12);
        today.setMinutes(0);
        today.setSeconds(0);
        today.setMilliseconds(0);
 
        return today;
    }
});
 
Object.extend(Date.prototype, {
    /**
     * @param offset Offset to apply
     * @param {optional} increment: Date.Day (default), Date.Month, Date.Year
     */
    shift: function(offset, increment) {
        increment = increment || Date.Day;
        var result = new Date(this.getTime());
 
        // Temporarily set the time at noon to avoid daylight savings exceptions.
        var actualHours = result.getHours();
        result.setHours(12);
 
        if(offset) {
            var norm = Math.abs(offset);
            var sign = offset / norm;
            offset = Math.round(norm);
 
            switch(increment) {
                case Date.Day:
                    result.setTime(result.getTime() + sign * offset * Date.Day.duration);
                    break;
                case Date.Month:
                    var yearOffset = Math.floor(offset / 12);
                    var monthOffset = offset % 12;
                    result = new Date(this.getFullYear() + sign * yearOffset,
                                      this.getMonth() + sign * monthOffset,
                                      1);
                    var daysCount = Date.Month.getDaysCount(result);
                    if(daysCount < this.getDate()) {
                        result.setDate(daysCount);
                    }
                    else {
                        result.setDate(this.getDate());
                    }
                    break;
                case Date.Year:
                    result = new Date(this.getFullYear() + sign * offset, this.getMonth(), 1);
                    var daysCount = Date.Month.getDaysCount(result);
                    if(daysCount < this.getDate()) {
                        result.setDate(daysCount);
                    }
                    else {
                        result.setDate(this.getDate());
                    }
                    break;
            }
        }
 
        // Restore initial hours.
        result.setHours(actualHours);
 
        return result;
    }
});
 
(function() {
    var legacy = Date.parse;
    Date.parse = function(representation, format) {
        format = format || "ISO";
        var date = null;
 
        switch(format) {
            case "ISO": /* partial ISO-8601 */
                var capture = representation.match(/^(\d{4})-(\d{2})-(\d{2})$/);
                if(capture) {
                    date = new Date(capture[1], capture[2] - 1, capture[3]);
                }
                break;
            default:
                date = legacy(representation);
                break;
        }
 
        if(date && isNaN(date.getTime())) {
            date = null;
        }
 
        return date;
    }
})();