JavaScript中扩展字符串与Date对象之间的转换,支持大多数日期格式的字符串(包括中文)

首先是对日期字符串的判断,支持格式yyyyMMdd, dd-MM-yyyy, yyyy-MM-dd, yyyy/MM/dd, dd/MM/yyyy, yyyy.MM.dd, dd.MM.yyyy,等任意相同分隔符(需程序员自己定义) 和yyyy年MM月dd日等多种格式,最重要的是支持瑞年2月的判断和每月30号和31号的判断,基本符合任意格式字符串的日期判断。

代码奉上:

/*! * date: 2009-2-13 * author: Xing,XiuDong * url: http://blog.csdn.net/xxd851116 * e-mail: xingxiudong[at]gmail.com * desciption: Expand String's method: isDate * version:v1.0 */ String.prototype.isDate = function() { // 定义日期正则表达式,改表达式引自:http://blog.csdn.net/Rocketboy911/archive/2007/09/14/1784784.aspx var pattern = /^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$/ var dateStr = this; //各种日期格式智能化判断 if(/^/d{8}$/.test(this)) { //格式为:yyyyMMdd dateStr = this.substring(0,4) + "-" + this.substring(4,6) + "-" + this.substring(6,8); } else if(/^/d{4}/D/d{2}/D/d{2}$/g.test(this)) { //格式为:yyyy(x-任意分隔符)MM(x)dd if(this.charAt(4) != this.charAt(7)) return false; dateStr = this.split(this.charAt(4)).join("-"); } else if(/^/d{2}/D/d{2}/D/d{4}$/g.test(this)) { //格式为:dd(x-任意分隔符)MM(x)yyyy if(this.charAt(2) != this.charAt(5)) return false; dateStr = this.split(this.charAt(2)).reverse().join("-"); } else if(/^/d{4}/u5e74((0[1-9])|(1[0-2]))/u6708((0[1-9])|([12]/d)|(3[01]))/u65e5$/.test(this)) { //对中文的支持,格式为:yyyy年MM月dd日 dateStr = this.replace(//u5e74|/u6708/g,"-").replace(//u65e5/g,""); } return pattern.test(dateStr); } 

测试代码:

println("yyyy/MM/dd格式的判断:"); println("2008/08/08: "+"2008/08/08".isDate());//对普通日期的判断 println("2008/02/28: "+"2008/02/28".isDate());//对闰月的判断 println("2008/02/29: "+"2008/02/29".isDate()); println("2009/02/28: "+"2009/02/28".isDate()); println("2009/02/29: "+"2009/02/29".isDate()); println("2008/08/31: "+"2008/08/31".isDate());//对大月和小月的判断 println("2008/07/31: "+"2008/07/31".isDate()); println("2008/06/30: "+"2008/06/30".isDate()); println("2008/06/31: "+"2008/06/31".isDate()); println("2008/08/32: "+"2008/08/32".isDate());//不符合日期的判断 println("2008/07/32: "+"2008/07/32".isDate()); println(); println("yyyy-MM-dd格式的判断:"); println("2008-08-08: "+"2008-08-08".isDate());//对普通日期的判断 println("2008-02-28: "+"2008-02-28".isDate());//对闰月的判断 println("2008-02-29: "+"2008-02-29".isDate()); println("2009-02-28: "+"2009-02-28".isDate()); println("2009-02-29: "+"2009-02-29".isDate()); println("2008-08-31: "+"2008-08-31".isDate());//对大月和小月的判断 println("2008-07-31: "+"2008-07-31".isDate()); println("2008-06-30: "+"2008-06-30".isDate()); println("2008-06-31: "+"2008-06-31".isDate()); println("2008-08-32: "+"2008-08-32".isDate());//不符合日期的判断 println("2008-07-32: "+"2008-07-32".isDate()); println(); println("中文格式的判断:"); println("2008年02月28日: "+"2008年02月28日".isDate()); println("2008年02月29日: "+"2008年02月29日".isDate()); println("2009年02月28日: "+"2009年02月28日".isDate()); println("2009年02月29日: "+"2009年02月29日".isDate()); println(); println("dd/MM/yyyy格式的判断:"); println("28/02/2008: "+"28/02/2008".isDate());//对闰月的判断 println("29/02/2008: "+"29/02/2008".isDate()); println("28/02/2009: "+"28/02/2009".isDate()); println("29/02/2009: "+"29/02/2009".isDate()); println(); println("yyyyMMdd格式的判断:"); println("20080228: "+"20080228".isDate());//对闰月的判断 println("20080229: "+"20080229".isDate()); println("20090228: "+"20090228".isDate()); println("20090229: "+"20090229".isDate()); println(); println("dd-MM-yyyy格式的判断:"); println("28-02-2008: "+"28-02-2008".isDate());//对闰月的判断 println("29-02-2008: "+"29-02-2008".isDate()); println("28-02-2009: "+"28-02-2009".isDate()); println("29-02-2009: "+"29-02-2009".isDate()); println(); println("目前不支持的格式:"); println("2008/8/8: "+"2008/8/8".isDate()); //目前暂不支持这种格式 println("2008/08-08: "+"2008/08-08".isDate()); 

测试结果:

yyyy/MM/dd格式的判断:
2008/08/08: true
2008/02/28: true
2008/02/29: true
2009/02/28: true
2009/02/29: false
2008/08/31: true
2008/07/31: true
2008/06/30: true
2008/06/31: false
2008/08/32: false
2008/07/32: false

yyyy-MM-dd格式的判断:
2008-08-08: true
2008-02-28: true
2008-02-29: true
2009-02-28: true
2009-02-29: false
2008-08-31: true
2008-07-31: true
2008-06-30: true
2008-06-31: false
2008-08-32: false
2008-07-32: false

中文格式的判断:
2008年02月28日: true
2008年02月29日: true
2009年02月28日: true
2009年02月29日: false

dd/MM/yyyy格式的判断:
28/02/2008: true
29/02/2008: true
28/02/2009: true
29/02/2009: false

yyyyMMdd格式的判断:
20080228: true
20080229: true
20090228: true
20090229: false

dd-MM-yyyy格式的判断:
28-02-2008: true
29-02-2008: true
28-02-2009: true
29-02-2009: false

目前不支持的格式:
2008/8/8: false
2008/08-08: false

你可能感兴趣的:(JavaScript,Date,正则表达式,function,测试,扩展)