JavaScript日期有效性检查

说明

  • .startTime, .endTime 对应时间组件或输入框的 class 属性,用于绑定事件

  • 错误弹框基于 layer ,可根据需要进行调整

  • 关于所输入日期,在当月是否有效的检查

    // 6 月只有 30 天,但是通过如下方式可将日期调整到有效的日期值
    > (new Date('2017-6-31')).toLocaleDateString()
    > "2017/7/1"
    
    // 月份不能超过12,天数不能超过31,否则返回无效日期的提示
    > (new Date('2017-6-33')).toLocaleDateString()
    > "Invalid Date"
    > (new Date('2017-33-31')).toLocaleDateString()
    > "Invalid Date"
    > (new Date('2055-2-31')).toLocaleDateString()
    > "2055/3/3"
    

注意

  1. toLocaleDateString() 有兼容性问题,部分浏览器不识别,不建议使用
  2. 执行类似 new Date('2017-06-28') 的时候,在各个浏览器得到了不同的结果,因为“-”也有兼容性问题,在使用 Date 的时候需要转换成“/”

完整代码

// 日期输入检查
$(document).delegate('.startTime, .endTime', 'focusout', function(event) {

    var _self = $(this);
    var sInputDate = _self.val();

    // 错误提示框
    var showErrAlert = function(sInprrMsg, inputBox) {
        alertMsg({
            msg: '您输入的日期【<b style="color:#ff0000">' + sInputDate + '</b>】错误:' + errMsg + ',请重新填写!',
            callback: function() {
                inputBox.focus(); // .datetimepicker('reset')
            }
        });
    };

    // 格式检查
    if (sInputDate) {

        var patern = /^20[0-9]{1}[0-9]{1}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[01])$/g; // 基本格式 20xx-xx-xx
        if (!patern.test(sInputDate)) { // 基本格式错误
            showErrAlert(sInputDate, '请输入正确格式: xxxx-xx-xx', _self);
            return false;
        } else {
            // 去除通过输入框中所输入日期的前导 0 (月份、日期),方便后面的比较
            // 将 - 转为 / ,以兼容各浏览器中 new Date() 的处理结果
            var sDate = sInputDate.replace(/-0|-/g, '\/');
            var aDate = sDate.split('\/');

            // 最大日期
            var maxDate = sInputDate.replace(/-/g, '');
            if (parseInt(maxDate) > 20380101) {
                showErrAlert(sInputDate, '最大日期不能超过 2038-01-01', _self);
                return false;
            }

            // 月份
            if (parseInt(aDate[1]) > 12) {
                showErrAlert(sInputDate, '最大月份不能超过 12', _self);
                return false;
            }

            // 日期
            if (parseInt(aDate[2]) > 31) {
                showErrAlert(sInputDate, '最大天数不能超过 31', _self);
                return false;
            }

            // 31 天、30天、28天
            var oDate = new Date(sDate.toString());
            var validDateStr = oDate.getFullYear() + '/' + (oDate.getMonth() + 1) + '/' + oDate.getDate();
            if (validDateStr != sDate) {
                showErrAlert(sInputDate, '超过当前月份的最大天数', _self);
                return false;
            }
        }
        return true;
    } else {
        showErrAlert(sInputDate, '还没有填写时间', inpbox);
        return false;
    }
});

转载于:https://my.oschina.net/antsky/blog/995322

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值