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;
}
})(); |
Partager