Javascript 日期对象Date扩展方法


Posted in Javascript onMay 30, 2009

今天在网上摘抄了些js中操作日期的相关方法,现在与大家分享一下。

<script type="text/javascript"> 
Date.prototype.Format = function(fmt) 
{ 
//author: meizz 
var o = 
{ 
"M+" : this.getMonth() + 1, //月份 
"d+" : this.getDate(), //日 
"h+" : this.getHours(), //小时 
"m+" : this.getMinutes(), //分 
"s+" : this.getSeconds(), //秒 
"q+" : Math.floor((this.getMonth() + 3) / 3), //季度 
"S" : this.getMilliseconds() //毫秒 
}; 
if (/(y+)/.test(fmt)) 
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 
for (var k in o) 
if (new RegExp("(" + k + ")").test(fmt)) 
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 
return fmt; 
} 
Date.prototype.addDays = function(d) 
{ 
this.setDate(this.getDate() + d); 
}; 
Date.prototype.addWeeks = function(w) 
{ 
this.addDays(w * 7); 
}; 
Date.prototype.addMonths= function(m) 
{ 
var d = this.getDate(); 
this.setMonth(this.getMonth() + m); 
if (this.getDate() < d) 
this.setDate(0); 
}; 
Date.prototype.addYears = function(y) 
{ 
var m = this.getMonth(); 
this.setFullYear(this.getFullYear() + y); 
if (m < this.getMonth()) 
{ 
this.setDate(0); 
} 
}; 
//测试 var now = new Date(); now.addDays(1);//加减日期操作 alert(now.Format("yyyy-MM-dd")); 
Date.prototype.dateDiff = function(interval,endTime) 
{ 
switch (interval) 
{ 
case "s": //?算秒差 
return parseInt((endTime-this)/1000); 
case "n": //?算分差 
return parseInt((endTime-this)/60000); 
case "h": //?算?r差 
return parseInt((endTime-this)/3600000); 
case "d": //?算日差 
return parseInt((endTime-this)/86400000); 
case "w": //?算?差 
return parseInt((endTime-this)/(86400000*7)); 
case "m": //?算月差 
return (endTime.getMonth()+1)+((endTime.getFullYear()-this.getFullYear())*12)-(this.getMonth()+1); 
case "y": //?算年差 
return endTime.getFullYear()-this.getFullYear(); 
default: //?入有? 
return undefined; 
} 
} 
//测试 var starTime = new Date("2007/05/12 07:30:00"); var endTime = new Date("2008/06/12 08:32:02"); document.writeln("秒差: "+starTime .dateDiff("s",endTime )+"<br>"); document.writeln("分差: "+starTime .dateDiff("n",endTime )+"<br>"); document.writeln("?r差: "+starTime .dateDiff("h",endTime )+"<br>"); document.writeln("日差: "+starTime .dateDiff("d",endTime )+"<br>"); document.writeln("?差: "+starTime .dateDiff("w",endTime )+"<br>"); document.writeln("月差: "+starTime .dateDiff("m",endTime )+"<br>"); document.writeln("年差: "+starTime .dateDiff("y",endTime )+"<br>"); 
</script>

具体扩展的方法如下:
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) { 
///<summary> 
///解析常用的中文日期并返回日期对象。 
///</summary> 
///<param name="dateString" type="string"> 
///日期字符串。包含的格式有:"xxxx(xx)-xx-xx xx:xx:xx","xxxx(xx).xx.xx xx:xx:xx", 
///"xxxx(xx)年xx月xx日 xx时xx分xx秒" 
///</param> 
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) { 
///<summary> 
///日期加减。 
///若returnNewObjec参数为true值,则操作结果由一个新的日期对象返回,原日期对象不变, 
///否则返回的是原日期对象,此时原日期对象的值是操作结果. 
///</summary> 
///<param name="datepart" type="string"> 
///日期加减的部分: 
///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 -- 毫秒 
///</param> 
///<param name="number" type="int"> 
///要加减的数量 
///</param> 
///<param name="returnNewObjec" type="bool"> 
///是否返回新的日期对象。若参数为true值,则返回一个新的日期对象,否则返回的是当前日期对象. 
///</param> 
///<returns type="Date"> 
///返回一个日期对象 
///</returns> 
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) { 
///<summary> 
///开始日期与当前日期的差,返回差的绝对值。 
///</summary> 
///<param name="datepart" type="string"> 
///日期加减的部分: 
///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 -- 毫秒 
///</param> 
///<param name="beginDate" type="DateTime"> 
///要用于比较我日期 
///</param> 
///<returns type="int"> 
///返回日期差的绝对值。 
///</returns> 
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() { 
///<summary> 
///获取当前日期所在年份中第一个星期的天数 
///</summary> 
return (7 - new Date(this.getFullYear(), 0, 1).getDay()); //JS里的月份也是从0开始的,0表示1月,依此类推。 
} 
Date.prototype.getLastWeekDays = function(year) { 
///<summary> 
///获取当前日期所在年份中最后一个星期的天数 
///</summary> 
return (new Date(this.getFullYear(), 11, 31).getDay() + 1); //JS里的月份也是从0开始的,0表示1月,依此类推。 
} 
Date.prototype.getWeeksOfYear = function() { 
///<summary> 
///获取当前日期所在年份的周数 
///</summary> 
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() { 
///<summary> 
///获取当前日期所在是一年中的第几季。返回一个季度整数值。 
///</summary> 
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() { 
///<summary> 
///获取当前日期所在是一年中的第几周。返回一个整数值。 
///</summary> 
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; 
} 
}
Javascript 相关文章推荐
javascript最常用与实用的创建类的代码
Aug 12 Javascript
JS等比例缩小图片尺寸的实例
Feb 27 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
jQuery简单实现禁用右键菜单
Mar 10 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
May 26 Javascript
JS触发服务器控件的单击事件(详解)
Aug 06 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 28 Javascript
Jquery 基础学习笔记之文档处理
May 29 #Javascript
Jquery 基础学习笔记
May 29 #Javascript
javascript AutoScroller 函数类
May 29 #Javascript
关于JavaScript的一些看法
May 27 #Javascript
广告切换效果(缓动切换)
May 27 #Javascript
js 图片缩放(按比例)控制代码
May 27 #Javascript
图片上传即时显示缩略图的js代码
May 27 #Javascript
You might like
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php session_decode函数用法讲解
2019/05/26 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
extjs render 用法介绍
2013/09/11 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
js实现微博发布小功能
2017/01/12 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
jQuery实现日历效果
2020/09/11 jQuery
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
对Python信号处理模块signal详解
2019/01/09 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Python字典底层实现原理详解
2019/12/18 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
Python Http请求json解析库用法解析
2020/11/28 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
铭立家具面试题
2012/12/06 面试题
绘画专业自荐信范文
2014/02/23 职场文书
法制宣传月活动方案
2014/05/11 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
讲座新闻稿
2015/07/18 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
python数字转对应中文的方法总结
2021/08/02 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang