javascript中对日期是比较弱的,特别是日期格式化和从字符中获取日期这两个功能是没有的,自己写程序的时候封装了这些功能,分享一下,希望对大家有用。这些扩展有些是网上一些朋友写的,经过我的改造,有些是我自己写的。
函数的功能分别是:
Date.prototype.format = function(format):根据表达式将日期格式化为字符串,要求指定一个参数format。参数format表示格式化的表达式,采用标准的日期表达式,如yyyy表示年,MM表示月。示例:new Date().format("yyyy-MM-dd");将返回2009-12-23的字符串。
Date.prototype.clone = function():日期克隆,这其实是一个比较简单的函数,日期是引用类型,所以会需要这个功能,特别是在参数传递的时候。
Date.prototype.dateDiff = function(interval, date):日期相减,这个函数我几写了日期天的相减,因为我还没有其它类型的日期相减,呵呵,如果你要用的话,自己写一下也很容易,改天我有时间再补上去吧。
Date.prototype.dateAdd = function(expr):日期相加,在日期计算的时候用,这个函数需要重点介绍就是expr这个表达式,这个表达式我后面有一个对String的扩展,它可以支持 +2d(表示加2天),3d(表示加3天),-5y(表示减5年),明白了么,非常实用的功能,直接写文本表达式就可以了。
String.prototype.dateExpression = function() :分析日期表达式,这个函数其实是为了dateAdd服务的,从表达式中提取计算日期的类型及相就的数字,其实dateDiff也应该用到这种方式,但我现在暂时没有时间去改。
String.prototype.toDateEx = function():直接从字符串中提取到日期,这个函数比较厉害,呵呵,如果你的日期比较规范,可以直接用这个函数提取就OK。我记得我在之前一篇文章中讲到过它,文章名字叫JS直接转换含中文的乱序字符为日期 ,有兴趣的不妨看一下。
String.prototype.toDate = function(format):这个函数是根据一个表达式从字符串提取日期,和toDateEx不同的事,它需要指定一个表达式才可以。其实我一直觉得这个函数有点庞大了,但是因为Javascript不支持正则的命名捕获组,所以一直没办法给它减肥,如果有朋友有更巧妙的方法可以实现,请给我留言或者发邮件给我,非常感谢。
介绍就这么多了,Javascript还是挺有意思的,弱类型的语言有它的好处,方便,但对于初学者来说,可能不太好,对于老手来说,可能会喜欢一些。在这些日期的扩展函数,用到蛮多的正则表达式,有时间我再介绍一下正则表达式在实际开发中的应用吧。
最后,发一个下载地址吧
代码:
/*对Javascript原有类型及方法进行扩展*/ /* Author:Conis URL: http://iove.net Copyright(C)Conis.cn 欢迎访问http://iove.net */ /*对Javascript原有类型及方法进行扩展*/ //===============================================对日期方法的扩展================================== //增加日期的format方法 Date.prototype.format = function(format) { var o = { "M+": this.getMonth() + 1, //month "d+": this.getDate(), //day "h+": this.getHours(), //hour "m+": this.getMinutes(), //minute "s+": this.getSeconds(), //second "q+": Math.floor((this.getMonth() + 3) / 3), //quarter "S": this.getMilliseconds() //millisecond } if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); return format; } //日期克隆 Date.prototype.clone = function() { return new Date(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds()); } //日期相减 Date.prototype.dateDiff = function(interval, date) { switch (interval.toLowerCase()) { case "d": return Math.ceil((this - date) / (1000 * 60 * 60 * 24)); break; } } //日期相� Date.prototype.dateAdd = function(expr) { var data = expr.dateExpression(); var tmpDate = this.clone(); if (data == null) return tmpDate; var k = { 'y': 'FullYear', 'q': 'Month', 'm': 'Month', 'w': 'Date', 'd': 'Date', 'h': 'Hours', 'n': 'Minutes', 's': 'Seconds', 'ms': 'Milliseconds' }; var offset = { 'q': 3, 'w': 7 }; var getFun = 'get' + k[data.interval]; tmpDate['set' + k[data.interval]](tmpDate[getFun]() + ((offset[data.interval] || 1) * data.number)); return tmpDate; } //获取分析后的日期偏移量数据 String.prototype.dateExpression = function() { var pattern = "^([+-]*)(\\d+)([yMdhms]|(ms))$"; var reg = new RegExp(pattern); if (RegExp(pattern).test(this)) { return { interval: RegExp.$3, number: parseInt((RegExp.$1 == "" || RegExp.$1 == "+") ? RegExp.$2 : -RegExp.$2) } } else { return null; } } //字符串转为日期,但不需要表达式 String.prototype.toDateEx = function() { var data = { y: 0, M: 0, d: 0, h: 0, m: 0, s: 0, ms: 0 }; var cn = { "年": "y", "月": "M", "日": "d", "时": "h", "分": "m", "秒": "s", "毫秒": "ms" }; var result = this.match(/\d+((ms)|[yMdhms年月日时分秒]|(毫秒))/ig); for (var i = 0; i < result.length; i++) { RegExp(/(\d+)([yMdhms年月日时分秒]|(毫秒))/).test(result[i]); if (data[RegExp.$2] == undefined) { //alert(cn[RegExp.$2]); data[cn[RegExp.$2]] = RegExp.$1; } else { data[RegExp.$2] = RegExp.$1; } } return new Date(data.y, data.M - 1, data.d, data.h, data.m, data.s, data.ms); } //将字符串转换为日期 String.prototype.toDate = function(format) { pattern = format.replace(/(yyyy)/g, "([0-9]{4})") .replace(/(yy)|(MM)|(dd)|(hh)|(mm)|(ss)/g, "([0-9]{2})") .replace(/[Mdhms]/g, "([0-9]{1,2})"); //获取子表达式的索引 getIndex = function(expr1, expr2) { var index = format.indexOf(expr1); if (index == -1) index = format.indexOf(expr2); return index; } var today = new Date(); var returnDate; if (new RegExp(pattern).test(this)) { var yPos = getIndex("yyyy", "yy"); var mPos = getIndex("MM", "M"); var dPos = getIndex("dd", "d"); var hPos = getIndex("hh", "h"); var miPos = getIndex("mm", "m"); var sPos = getIndex("ss", "s"); var data = { y: 0, m: 0, d: 0, h: 0, mi: 0, s: 0 }; //对索引进行排序 var pos = new Array(yPos + ",y", mPos + ",m", dPos + ",d", hPos + ",h", miPos + ",mi", sPos + ",s").sort( function(a, b) { a = parseInt(a.split(",")[0]); b = parseInt(b.split(",")[0]); return a > b; } ); //删除索引为-1的数组 var tmpIndex = 0; var newPos = new Array(); for (var i = 0; i < pos.length; i++) { if (parseInt(pos[i].split(",")[0]) != -1) { newPos[tmpIndex] = pos[i]; tmpIndex++; } } //与当前文本进行匹配 var m = this.match(pattern); for (var i = 1; i < m.length; i++) { if (i == 0) return; var flag = newPos[i - 1].split(',')[1]; data[flag] = m[i]; }; data.y = data.y || today.getFullYear(); //年如果为空,则取当前年 data.d = data.d || today.getDate(); //天如果为空,则取今天 //月不需要处理,因为月的0月是1月 //如果年是yy格式,则加上20 if (data.y.toString().length == 2) data.y = parseInt("20" + data.y); data.m -= 1; returnDate = new Date(data.y, data.m, data.d, data.h, data.mi, data.s); } returnDate = returnDate || today; return returnDate; }
注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/
本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/
浙公网安备 33010602011771号