js校验日期时间的正则表达式

没想到要校验日期时间还挺费劲,虽然只是要支持个标准格式的yyyy/mm/dd hh:mm:ss。
js正则表达式如下:
let reg = /[1-9]\d{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-9]))) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/;
reg.test(“2022/08/04 16:16:22”)
注意必须是标准的4位年份、2位月、日、时、分、秒。
解析正则表达式:
1、年份[1-9]\d{3},支持从1000年到9999年,对于现在的项目来说,够用了。
2、月份和日期联合:(((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-9])))
这里有三种情况:
第一种:对于1、3、5、7、8、10、12月份,是01-31号。所以是(0[13578]|1[02])/(0[1-9]|[12][0-9]|3[01]),其中(0[13578]|1[02])代表了0开头的1、3、5、7、8月,而1[02]代表了10、12月份。0[1-9]|[12][0-9]|3[01]则针对0开头的01-09日、10日到29日、30、31日。
第二种:对于4、6、9、11月份,只有30号,所以是(0[469]|11)/(0[1-9]|[12][0-9]|30)。
第三种:对于2月份,02/(0[1-9]|[1][0-9]|2[0-9]),注意这里的2月份并不校验哪一年可以润月,所以单靠一个正则表达式校验日期很难。
时间就简单多了,后面的([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]代表了小时、分、秒的正则,因为小时是00-23,所以针对0、1开头的后面可以跟0-9,但是对于2开头的,只能是0-3,后面的分钟、秒则是同一个规则,从00-59.

再结合闰年的判断,需要一个函数来判断一个日期时间是否合法:

function isDateTime(value) {
        let reg = /[1-9]\d{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-9]))) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/;
        if (!reg.test(value)) {
            return false;
        }
        let arr = value.split('/');
        let year = parseInt(arr[0]);
        let month = parseInt(arr[1]);
        let day = parseInt(arr[2]);
        if (month != 2 || day < 29) {
            return true; // 不必校验闰年,肯定是合法时间了
        }
        console.log(year)
        // 能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            console.log("====")
        } else {
            // 平年的2月只有28号
            if (month == 2 && day > 28) {
                return false;
            }
        }
        return true;
    }
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值