

具体扩展的方法如下: 
parseCHS--静态方法。解析常用的中文日期并返回日期对象。 
add--日期加减操作。[注:此函数在上传时还存在一个BUG。请下载后把此函数内的第一行"var regExp = /^\d+$/;" 改为 "var regExp = /^([+-])?\d+$/;", 要不然就做不了减法。] 
dateDiff--日期差。开始日期与当前日期的差,返回差的绝对值。 
getFirstWeekDays--获取当前日期所在年份中第一个星期的天数。 
getLastWeekDays--获取当前日期所在年份中最后一个星期的天数。 
getWeeksOfYear--获取当前日期所在年份的周数。 
getWeek--获取当前日期所在是一年中的第几周。返回一个整数值。 
getSeason--获取当前日期所在是一年中的第几季。返回一个季度整数值。 
详细注释及参数,请参考JS文件内的注释。 
 代码如下:
/* 
===================================================================================== 
Description:Date对象扩展。包括常用中文日期格式解析、加减操作、日期差、周操作和季操作。 
Author:Dezwen. 
Date:2009-5-30. 
===================================================================================== 
*/ 
Date.parseCHS = function(dateString) { 
///
///解析常用的中文日期并返回日期对象。 
///
/// 
///日期字符串。包含的格式有:"xxxx(xx)-xx-xx xx:xx:xx","xxxx(xx).xx.xx xx:xx:xx", 
///"xxxx(xx)年xx月xx日 xx时xx分xx秒" 
/// 
var regExp1 = /^\d{4}-\d{1,2}-\d{1,2}( \d{1,2}:\d{1,2}:\d{1,2})?$/; 
var regExp2 = /^\d{4}\.\d{1,2}\.\d{1,2}( \d{1,2}:\d{1,2}:\d{1,2})?$/; 
var regExp3 = /^\d{4}年d{1,2}月d{1,2}日( \d{1,2}时d{1,2}分d{1,2}秒)?$/; 
if (regExp1.test(dateString)) { } 
else if (regExp2.test(dateString)) { 
dateString = dateString.replace(/\./g, "-"); 
} 
else if (regExp3.test(dateString)) { 
dateString = dateString.replace("年", "-").replace( 
"月", "-").replace("日", "").replace("时", ":").replace("分", ":" 
).replace("秒", ""); 
} 
else { 
throw "传给Date.parseCHS的参数值的格式不正确。请传递一个有效的日期格式字符串作为参数。"; 
} 
var date_time = dateString.split(" "); 
var date_part = date_time[0].split("-"); 
var time_part = (date_time.length > 1 ? date_time[1].split(":") : ""); 
if (time_part == "") { 
return new Date(date_part[0], date_part[1] - 1, date_part[2]); 
} 
else { 
return new Date(date_part[0], date_part[1] - 1, date_part[2], time_part[0], time_part[1], time_part[2]); 
} 
} 
Date.prototype.add = function(datepart, number, returnNewObjec) { 
///
///日期加减。 
///若returnNewObjec参数为true值,则操作结果由一个新的日期对象返回,原日期对象不变, 
///否则返回的是原日期对象,此时原日期对象的值是操作结果. 
///
/// 
///日期加减的部分: 
///Year, yy, yyyy--年 
///quarter, qq, q --季 
///Month, mm, m -- 月 
///dayofyear, dy, y-- 日 
///Day, dd, d -- 日 
///Week, wk, ww -- 周 
///Hour, hh -- 小时 
///minute, mi, n -- 分钟 
///second, ss, s -- 秒 
///millisecond, ms -- 毫秒 
/// 
/// 
///要加减的数量 
/// 
/// 
///是否返回新的日期对象。若参数为true值,则返回一个新的日期对象,否则返回的是当前日期对象. 
/// 
///
///返回一个日期对象 
///
var regExp = /^\d+$/; 
if (regExp.test(number)) { 
number = parseInt(number); 
} 
else { number = 0; } 
datepart = datepart.toLowerCase(); 
var tDate; 
if (typeof (returnNewObjec) == "boolean") { 
if (returnNewObjec == true) { 
tDate = new Date(this); 
} 
else { tDate = this; } 
} 
else { tDate = this; } 
switch (datepart) { 
case "year": 
case "yy": 
case "yyyy": 
tDate.setFullYear(this.getFullYear() + number); 
break; 
case "quarter": 
case "qq": 
case "q": 
tDate.setMonth(this.getMonth() + (number * 3)); 
break; 
case "month": 
case "mm": 
case "m": 
tDate.setMonth(this.getMonth() + number); 
break; 
case "dayofyear": 
case "dy": 
case "y": 
case "day": 
case "dd": 
case "d": 
tDate.setDate(this.getDate() + number); 
break; 
case "week": 
case "wk": 
case "ww": 
tDate.setDate(this.getDate() + (number * 7)); 
break; 
case "hour": 
case "hh": 
tDate.setHours(this.getHours() + number); 
break 
case "minute": 
case "mi": 
case "n": 
tDate.setMinutes(this.getMinutes() + number); 
break 
case "second": 
case "ss": 
case "s": 
tDate.setSeconds(this.getSeconds() + number); 
break; 
case "millisecond": 
case "ms": 
tDate.setMilliseconds(this.getMilliseconds() + number); 
break; 
} 
return tDate; 
} 
Date.prototype.dateDiff = function(datepart, beginDate) { 
///
///开始日期与当前日期的差,返回差的绝对值。 
///
/// 
///日期加减的部分: 
///Year, yy, yyyy--年 ; 
///quarter, qq, q --季 
///Month, mm, m -- 月 
///dayofyear, dy, y-- 日 
///Day, dd, d -- 日 
///Week, wk, ww -- 周 
///Hour, hh -- 小时 
///minute, mi, n -- 分钟 
///second, ss, s -- 秒 
///millisecond, ms -- 毫秒 
/// 
/// 
///要用于比较我日期 
/// 
///
///返回日期差的绝对值。 
///
datepart = datepart.toLowerCase(); 
var yearDiff = Math.abs(this.getFullYear() - beginDate.getFullYear()); 
switch (datepart) { 
case "year": 
case "yy": 
case "yyyy": 
return yearDiff; 
case "quarter": 
case "qq": 
case "q": 
var qDiff = 0; 
switch (yearDiff) { 
case 0: 
qDiff = Math.abs(this.getSeason() - beginDate.getSeason()); 
break; 
case 1: 
qDiff = (this.getSeason() - new Date(this.getFullYear(), 0, 1).getSeason()) + 
(new Date(beginDate.getFullYear(), 11, 31).getSeason() - 
beginDate.getSeason()) + 1; 
break; 
default: 
qDiff = (this.getSeason() - new Date(this.getFullYear(), 0, 1).getSeason()) + 
(new Date(beginDate.getFullYear(), 11, 31).getSeason() - 
beginDate.getSeason()) + 1 + (yearDiff - 1) * 4; 
break; 
} 
return qDiff; 
case "month": 
case "mm": 
case "m": 
var monthDiff = 0; 
switch (yearDiff) { 
case 0: 
monthDiff = Math.abs(this.getMonth() - beginDate.getMonth()); 
break; 
case 1: 
monthDiff = (this.getMonth() - new Date(this.getFullYear(), 0, 1).getMonth()) + 
(new Date(beginDate.getFullYear(), 11, 31).getMonth() - 
beginDate.getMonth()) + 1; 
break; 
default: 
monthDiff = (this.getMonth() - new Date(this.getFullYear(), 0, 1).getMonth()) + 
(new Date(beginDate.getFullYear(), 11, 31).getMonth() - 
beginDate.getMonth()) + 1 + (yearDiff - 1) * 12; 
break; 
} 
return monthDiff; 
case "dayofyear": 
case "dy": 
case "y": 
case "day": 
case "dd": 
case "d": 
return Math.abs((this.setHours(0, 0, 0, 0) - beginDate.setHours(0, 0, 0, 0)) / 1000 / 60 / 60 / 24); 
case "week": 
case "wk": 
case "ww": 
var weekDiff = 0; 
switch (yearDiff) { 
case 0: 
weekDiff = Math.abs(this.getWeek() - beginDate.getWeek()); 
break; 
case 1: 
weekDiff = (this.getWeek() - new Date(this.getFullYear(), 0, 1).getWeek()) + 
(new Date(beginDate.getFullYear(), 11, 31).getWeek() - 
beginDate.getWeek()) + 1; 
break; 
default: 
weekDiff = (this.getWeek() - new Date(this.getFullYear(), 0, 1).getWeek()) + 
(new Date(beginDate.getFullYear(), 11, 31).getWeek() - 
beginDate.getWeek()) + 1; 
var thisYear = this.getFullYear(); 
for (var i = 1; i < yearDiff; i++) { 
weekDiff += new Date(thisYear - i, 0, 1).getWeeksOfYear(); 
} 
break; 
} 
return weekDiff; 
case "hour": 
case "hh": 
return Math.abs((this - beginDate) / 1000 / 60 / 60); 
case "minute": 
case "mi": 
case "n": 
return Math.abs((this - beginDate) / 1000 / 60); 
case "second": 
case "ss": 
case "s": 
return Math.abs((this - beginDate) / 1000); 
case "millisecond": 
case "ms": 
return Math.abs(this - beginDate); 
} 
} 
Date.prototype.getFirstWeekDays = function() { 
///
///获取当前日期所在年份中第一个星期的天数 
///
return (7 - new Date(this.getFullYear(), 0, 1).getDay()); //JS里的月份也是从0开始的,0表示1月,依此类推。 
} 
Date.prototype.getLastWeekDays = function(year) { 
///
///获取当前日期所在年份中最后一个星期的天数 
///
return (new Date(this.getFullYear(), 11, 31).getDay() + 1); //JS里的月份也是从0开始的,0表示1月,依此类推。 
} 
Date.prototype.getWeeksOfYear = function() { 
///
///获取当前日期所在年份的周数 
///
return (Math.ceil((new Date(this.getFullYear(), 11, 31, 23, 59, 59) - 
new Date(this.getFullYear(), 0, 1)) / 1000 / 60 / 60 / 24) - 
this.getFirstWeekDays() - this.getLastWeekDays()) / 7 + 2; 
} 
Date.prototype.getSeason = function() { 
///
///获取当前日期所在是一年中的第几季。返回一个季度整数值。 
///
var month = this.getMonth(); 
switch (month) { 
case 0: 
case 1: 
case 2: 
return 1; 
case 3: 
case 4: 
case 5: 
return 2; 
case 6: 
case 7: 
case 8: 
return 3; 
default: 
return 4; 
} 
} 
Date.prototype.getWeek = function() { 
///
///获取当前日期所在是一年中的第几周。返回一个整数值。 
///
var firstDate = new Date(this.getFullYear(), 0, 1); 
var firstWeekDays = this.getFirstWeekDays(); 
var secondWeekFirstDate = firstDate.add("dd", firstWeekDays, true); 
var lastDate = new Date(this.getFullYear(), 11, 31); 
var lastWeekDays = this.getLastWeekDays(); 
if (this.dateDiff("day", firstDate) < firstWeekDays) { 
return 1; 
} 
else if (this.dateDiff("day", lastDate) < lastWeekDays) { 
return this.getWeeksOfYear(); 
} 
else { 
return Math.ceil((this - secondWeekFirstDate) / 1000 / 60 / 60 / 24 / 7) + 1; 
} 
} 
 
