涂雅[博客园]
最新文章请访问独立博客:http://iove.net

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/

posted on 2009-12-23 21:42  Conis  阅读(278)  评论(0)    收藏  举报