You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
4.3 KiB
JavaScript

Date.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
Date.abbrDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
Date.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
Date.abbrMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
Date.firstDayOfWeek = 1;
Date.format = 'mm/dd/yyyy';
Date.fullYearStart = '20';
(function() {
function add(name, method) {
if( !Date.prototype[name] ) {
Date.prototype[name] = method;
}
};
add("isLeapYear", function() {
var y = this.getFullYear();
return (y%4==0 && y%100!=0) || y%400==0;
});
add("isWeekend", function() {
return this.getDay()==0 || this.getDay()==6;
});
add("isWeekDay", function() {
return !this.isWeekend();
});
add("getDaysInMonth", function() {
return [31,(this.isLeapYear() ? 29:28),31,30,31,30,31,31,30,31,30,31][this.getMonth()];
});
add("getDayName", function(abbreviated) {
return abbreviated ? Date.abbrDayNames[this.getDay()] : Date.dayNames[this.getDay()];
});
add("getMonthName", function(abbreviated) {
return abbreviated ? Date.abbrMonthNames[this.getMonth()] : Date.monthNames[this.getMonth()];
});
add("getDayOfYear", function() {
var tmpdtm = new Date("1/1/" + this.getFullYear());
return Math.floor((this.getTime() - tmpdtm.getTime()) / 86400000);
});
add("getWeekOfYear", function() {
return Math.ceil(this.getDayOfYear() / 7);
});
add("setDayOfYear", function(day) {
this.setMonth(0);
this.setDate(day);
return this;
});
add("addYears", function(num) {
this.setFullYear(this.getFullYear() + num);
return this;
});
add("addMonths", function(num) {
var tmpdtm = this.getDate();
this.setMonth(this.getMonth() + num);
if (tmpdtm > this.getDate())
this.addDays(-this.getDate());
return this;
});
add("addDays", function(num) {
//this.setDate(this.getDate() + num);
this.setTime(this.getTime() + (num*86400000) );
return this;
});
add("addHours", function(num) {
this.setHours(this.getHours() + num);
return this;
});
add("addMinutes", function(num) {
this.setMinutes(this.getMinutes() + num);
return this;
});
add("addSeconds", function(num) {
this.setSeconds(this.getSeconds() + num);
return this;
});
add("zeroTime", function() {
this.setMilliseconds(0);
this.setSeconds(0);
this.setMinutes(0);
this.setHours(0);
return this;
});
add("asString", function(format) {
var r = format || Date.format;
if (r.split('mm').length>1) { // ugly workaround to make sure we don't replace the m's in e.g. noveMber
r = r.split('mmmm').join(this.getMonthName(false))
.split('mmm').join(this.getMonthName(true))
.split('mm').join(_zeroPad(this.getMonth()+1))
} else {
r = r.split('m').join(this.getMonth()+1);
}
r = r.split('yyyy').join(this.getFullYear())
.split('yy').join((this.getFullYear() + '').substring(2))
.split('dd').join(_zeroPad(this.getDate()))
.split('d').join(this.getDate());
return r;
});
Date.fromString = function(s)
{
var f = Date.format;
var d = new Date('01/01/1970');
if (s == '') return d;
s = s.toLowerCase();
var matcher = '';
var order = [];
var r = /(dd?d?|mm?m?|yy?yy?)+([^(m|d|y)])?/g;
var results;
while ((results = r.exec(f)) != null)
{
switch (results[1]) {
case 'd':
case 'dd':
case 'm':
case 'mm':
case 'yy':
case 'yyyy':
matcher += '(\\d+\\d?\\d?\\d?)+';
order.push(results[1].substr(0, 1));
break;
case 'mmm':
matcher += '([a-z]{3})';
order.push('M');
break;
}
if (results[2]) {
matcher += results[2];
}
}
var dm = new RegExp(matcher);
var result = s.match(dm);
for (var i=0; i<order.length; i++) {
var res = result[i+1];
switch(order[i]) {
case 'd':
d.setDate(res);
break;
case 'm':
d.setMonth(Number(res)-1);
break;
case 'M':
for (var j=0; j<Date.abbrMonthNames.length; j++) {
if (Date.abbrMonthNames[j].toLowerCase() == res) break;
}
d.setMonth(j);
break;
case 'y':
d.setYear(res);
break;
}
}
return d;
};
// utility method
var _zeroPad = function(num) {
var s = '0'+num;
return s.substring(s.length-2)
//return ('0'+num).substring(-2); // doesn't work on IE :(
};
})();