说明
-
.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"
注意:
- toLocaleDateString() 有兼容性问题,部分浏览器不识别,不建议使用
- 执行类似 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;
}
});