史上最详细的js日期正则表达式分享
最简单的正则如:/d{4}-/d{2}-/d{2}
但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....
对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-0100:00:00到9999-12-3123:59:59。
UNIX时间戳的0按照ISO8601规范为:1970-01-01T00:00:00Z。
先考虑与年份无关的前三条规则,年份可统一写作
(?!0000)[0-9]{4}
下面仅考虑月和日的正则
1.包括平年在内的所有年份的月份都包含1-28日
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
2.包括平年在内的所有年份除2月外都包含29和30日
(0[13-9]|1[0-2])-(29|30)
3.包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日
(0[13578]|1[02])-31)
合起来就是除闰年的2月29日外的其它所有日期
(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)
接下来考虑闰年的实现
1:四年一闰
([0-9]{2}(0[48]|[2468][048]|[13579][26])
2:百年不闰,四百年再闰
(0[48]|[2468][048]|[13579][26])00
3:合起来就是所有闰年的2月29日
([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)
四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则
^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$
考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
分类:JavaScript
js日期正则表达式支持月日验证
这款js日期正则表达式支持月日验证,我们会一一举例说明一下有关日期验证表达式的函数实例了.
functionisdate(str){
varresult=str.match(/^(d{4})(-|/)(d{1,2})2(d{1,2})$/);
if(result==null)returnfalse;
vard=newDate(result[1],result[3]-1,result[4]);
return(d.getFullYear()==result[1]&&d.getMonth()+1==result[3]&&d.getDate()==result[4]);
}
检查是否为YYYY-MM-DD||YYYY/MM/DD的日期格式
面仅考虑月和日的正则
1.包括平年在内的所有年份的月份都包含1-28日
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
2.包括平年在内的所有年份除2月外都包含29和30日
(0[13-9]|1[0-2])-(29|30)
3.包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日
(0[13578]|1[02])-31)
合起来就是除闰年的2月29日外的其它所有日期
(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)
functionisdatetime(str)
{
varresult=str.match(/^(d{4})(-|/)(d{1,2})2(d{1,2})(d{1,2}):(d{1,2}):(d{1,2})$/);
if(result==null)returnfalse;
vard=newDate(result[1],result[3]-1,result[4],result[5],result[6],result[7]);
return(d.getFullYear()==result[1]&&(d.getMonth()+1)==result[3]&&d.getDate()==result[4]&&d.getHours()==result[5]&&d.getMinutes()==result[6]&&d.getSeconds()==result[7]);
}
//判断输入是否是有效的长日期格式-"YYYY-MM-DDHH:MM:SS"||"YYYY/MM/DDHH:MM:SS"
这是yyyy-mm-ddhh:mm:ss的
/^(d{4})-(d{2})-(d{2})(d{2}):(d{2}):(d{2})$/;
这是yyyy-mm-ddde的
/^(d{4})-(d{2})-(d{2})$/