今天头让我修改个javascript方法,验证输入的日期是否符合要求。恩。我们的要求是yyyy-mm-dd这样的格式,其他的统统不符合要求。原来的方法没用正则表达式,用了一堆判断。、

其实我也很头疼正则表达式,百度了一些资料,总结一下,这里留个备份吧。

要考虑的问题:合法的日期是多少;每个月的天数不一样;闰年的问题。。。。

1、合法的日期:MSDN上规定--在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间

查看http://msdn.microsoft.com/zh-cn/library/system.datetime(VS.80).aspx

2、闰年的概念:百度百科说明--四年一闰,百年不闰,四百年再闰

查看http://baike.baidu.com/view/29649.htm

3、整合表达式

平年:

年份可统一写作:(?!0000)[0-9]{4}
包括平年在内的所有年份的月份都包含1-28日:(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
包括平年在内的所有年份除2月外都包含29和30日:(0[13-9]|1[0-2])-(29|30)
包括平年在内的所有年份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)
润年

能被4整除但不能被100整除的年份:([0-9]{2}(0[48]|[2468][048]|[13579][26])
能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00:(0[48]|[2468][048]|[13579][26])00
合起来就是所有闰年的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)$

有关正则表达式的捕获/非捕获 参看: http://www.jb51.net/article/28035.htm

最后是更新的javascript方法

复制代码 代码如下:

function checkDate(fname){
var sc = $("#"+fname);
var s = sc.val();
if (sc==null){
alert("Element is null");
return true;
}
var reg=/^(?:(?!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)$/;
if(!s.match(reg)){
alert("false");
}else{
alert("true"); }

}

复制代码 代码如下:

<body>
<input type="date" name="textfield" id="text1" >
<input type="button" value="按钮" onClick="checkDate('text1')">
</body>

正确的正则表达式(包括测试代码):

复制代码 代码如下:

var str = '2009-12-33';
if(str.match(/^((?:19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/)) {
alert('是日期');
} else {
alert('不是日期');
}

转载于:https://www.cnblogs.com/ketam68/archive/2012/05/03/2480831.html

匹配yyyy-mm-dd日期格式的的正则表达式相关推荐

  1. YYYY/MM/dd 日期format的幺蛾子

    其实YYYY/MM/dd 和yyyy/MM/dd是不同的,而且YYYY/MM/dd 可能会出现年份的大bug,下面直接上代码 @org.junit.Testpublic void dateYYYY() ...

  2. 得到 yyyy/mm/dd 格式时间

    在做项目的时候:很多文件都是按数据添加时间的年/月/日的目录保存 做的时候发现不能直接 DateTime(yyyy-mm-dd).ToString("yyyy/MM/dd")得到 ...

  3. 将字符串格式yyyy/MM/dd的字符串转为日期,格式“yyyy-MM-dd“

    将字符串格式yyyy/MM/dd的字符串转为日期,格式"yyyy-MM-dd" public static String strToDateFormat(String date) ...

  4. Python写,将输入的yyyy/mm/dd格式的日期显示为yyyy年mm月dd日。

    7.(程序题)编程将输入的yyyy/mm/dd格式的日期显示为yyyy年mm月dd日. str = input("请输入日期:") length=len(str) if str[6 ...

  5. 年月日格式判断-正则表达式 YYYY/MM/DD、YYYY/MM/DD| YY/MM/DD、 ^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}…

    一.简单的日期判断(YYYY/MM/DD): ^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$ 二.演化的日期判断(YYYY/MM/DD| YY/MM/DD): ^(^(\d{4}| ...

  6. Js日期yyyy-MM-dd与yyyy/MM/dd的区别

    在JavaScript中日期yyyy-MM-dd格式与yyyy/MM/dd为不同的日期表达式 console.log('2020-10-29', new Date('2020-10-29')) con ...

  7. vue3时间格式转换为yyyy/mm/dd,yyyy-MM-dd,yyyy-MM-dd hh:mm:ss,hh:mm,yyyy-MM-ddThh:mm:ss+08:00

    时间格式转换为yyyy/mm/dd export const dateFormat1 = (time = new Date().getTime()) => { //YYYY/MM/DDconst ...

  8. 【怒怼老乔】苹果手机ios系统居然特喵的不支持日期yyyy-MM-dd HH:mm:ss.ms,只支持 yyyy/MM/dd HH:mm:ss

    苹果手机ios系统居然特喵的 不支持日期yyyy-MM-dd HH:mm:ss.ms, 只支持yyyy/MM/dd HH:mm:ss 我只能用 .replace(/\-/g,'\/'); 来替换掉了, ...

  9. 小程序ios时间格式 yyyy/MM/dd

    小程序选用f2-canvas画图表, 横坐标是时间. 实际上线后,发现android上是好的,但是iphone上显示不对,后来发现是时间格式问题,ios不识别yyyy-MM-dd, 要转换成yyyy/ ...

  10. yyyy/mm/dd变成yyyy-mm-dd

    当电脑的日期格式不是yyyy/mm/dd的形式的时候,假使是yyyy-mm-dd格式, 即便在程序中格式化日期格式yyyy/mm/dd,但是做成的日期却是yyyy-mm-dd. 不能只是单纯的Shor ...

最新文章

  1. 2019年最新10份开源Java精选资料
  2. Android图片剪裁库
  3. ORA-04031:oracle无法分配共享内存
  4. cad在哪里设置图幅大小_一看就懂!菜鸟也能快速入门CAD,关键掌握这4个诀窍...
  5. Lodop 打印控件
  6. P4879-ycz的妹子【分块】
  7. 深入JVM——OOM异常解析
  8. java web的动静分离_Apache结合Tomcat实现动静分离的方法
  9. Web前端笔记-two.js画三角形及画tip含tip旋转
  10. raspberry pi3_Raspberry Pi 3,Linux Mint安全漏洞,针对Zika病毒的Google数据处理等
  11. AJAX - 创建XMLHttpRequest 对象
  12. c# 遍历文件夹深度_C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)...
  13. python语音转文字源码_python文字转语音实现过程解析
  14. 广西教育培训网(Gxpx365)2018公务员全员培训考试参考+学法用法答案搜索工具
  15. minidump详细介绍
  16. 2021Java笔试题总结!三星java经典手机游戏
  17. 【信源编码】Huffman Coding原理以及MATLAB实现
  18. IEEE邮件爆出:禁止华为员工审稿,惨遭网友吐槽!
  19. 一个博士在华为的22年!
  20. Let_god_knows

热门文章

  1. XGBoost实战与调参优化
  2. 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别【转载】
  3. 设定pic单片机端口为输入_PIC单片机IO端口的软件/硬件可靠性使用方法讨论
  4. JQuery EasyUI入门
  5. linux 系统错误表 和对应的数值
  6. android 框架_AOP编程_Android优雅权限框架(2)Demo完全解析
  7. dhcp软件_tp-link无线路由器软件如何升级【教程图解】
  8. http://syy7.com/a/33.php,CVE-2020-7062
  9. java函数参数 省略号_[转] java使用省略号代替多参数.pdf
  10. java httpclient4_httpclient4使用说明