用JavaScript校验日期的合法性
校验表单时可能会遇到校验日期是否正确。可以利用JS的内置对象Date帮助我们完成日期校验。
思路是首先用被校验日期(假设为A,可能为字符串或数字)创建一个Date对象(假设为B)。
然后判断A和B的年、月、日是否全部相等。如果是,说明A是合法的;否则,A的范围有误。
用代码表示为:
// 被校验日期A:2008年3月15日
var year = 2008,
month = 3,
date = 15;
// 创建Date对象B
var B = new Date(year, month-1, date);
// 判断A和B的年月日是否全部相等
if (year === B.getFullYear() && month === B.getMonth()+1 && date === B.getDate()) {
// 全部相等,被校验日期合法
} else {
// 不全部相等,被校验日期的年、月、日至少有一个错误。
}
这里容易踩坑的地方是,Date对象月份从零开始:0表示一月,1表示二月,...,11表示十二月。
为什么要构建一个Date对象?这就要涉及到Date构造函数的语法了。
官网上上给出了四种调用构造函数的形式:
- 第一种:
new Date() - 第二种:
new Date(value) - 第三种:
new Date(dateString) - 第四种:
new Date(new Date(year, month[, date[, hours[, minutes[, seconds[, milliseconds]]]]]);
解释如下:
- 第一种:根据系统设置,返回当前日期时间。
- 第二种:value为整数型,表示从1970年1月1日 00:00:00 距现在所过去的毫秒数。
- 第三种:dateString为字符串型,其格式需满足指定格式。
- 第四种:各参数都是整数型。
当拿到了被校验日期的年、月、日之后,计算毫秒数或构造日期格式字符串都比较麻烦。所以这里使用第四种。
这时,调用Date构造函数的另一条规则就起作用了:如果参数值超过了合理范围,则它会被调整到临近值。我理解的就是,构造函数会为不合理的参数做进位运算。
举个例子,new Date(2013,13,1)相当于new Date(2014,1,1),也就是 2013年14月1日被进位成 2014年2月1日。
再回到之前的校验代码:
// 被校验日期A:2013年14月1日
var year = 2013,
month = 14,
date = 1;
// 创建Date对象B
var B = new Date(2013, 13, 1);
// B --> new Date(2014, 1, 1);
// B.getFullYear() === 2014
// B.getMonth() === 1
// B.getDate() === 1
// 可以看到,year !== B.getFullYear() 并且 month !== B.getMonth()
// 所以判断出被校验日期是非法的。
再增强一下我们的程序,使之可以判断多种格式的被校验日期:
- 年、月、日,例如(2008, 3, 15)、('2008', '3', '15')
- 特殊字符分割的字符串,例如('2008-03-15', '-')、('2008/3/15', '/')
- 连续8位的数字格式,例如'20080315'、20080315
我写了一段简易的代码,仅供参考:
function isValidDate() {
var year = 0,
month = 0,
date = 0;
if (arguments.length === 3) {
// 2008 3 15
// '2008' '3' '15'
year = Number(arguments[0]);
month = Number(arguments[1]);
date = Number(arguments[2]);
} else if (arguments.length === 2) {
// '2008-03-15' '-'
// '2008/3/15' '/'
// 参数必须为字符串类型,分隔符不能为空字符串或数字
var str = arguments[0],
seperator = arguments[1],
dateArray = str.split(seperator);
year = Number(dateArray[0]);
month = Number(dateArray[1]);
date = Number(dateArray[2]);
} else if (arguments.length === 1) {
// '20080315'
// 20080315
// 参数必须为8位,且只能为数字
var str = String(arguments[0]);
year = Number(str.slice(0, 4));
month = Number(str.slice(4, 6));
date = Number(str.slice(6));
}
var dateObj = new Date(year, month-1, date),
nYear = dateObj.getFullYear(),
nMonth = dateObj.getMonth() + 1,
nDate = dateObj.getDate();
if (year === nYear && month === nMonth && date === nDate) {
return true;
} else {
return false;
}
}
// 测试
isValidDate.assert = function(value) {
if (value) {
console.log('pass');
} else {
console.log('failed');
}
}
isValidDate.test = function() {
var assert = isValidDate.assert;
assert(isValidDate(2008, 2, 29)===true);
assert(isValidDate(2008, 3, 33)===false);
assert(isValidDate(2017, 13, 01)===false);
assert(isValidDate(2018, 5, 12)===true);
assert(isValidDate('2008-2-29','-')===true);
assert(isValidDate('2008/02/29','/')===true);
assert(isValidDate('2008 03 17',' ')===true);
assert(isValidDate('2008,13,01',',')===false);
assert(isValidDate('2008,12,01',',')===true);
assert(isValidDate('20080229')===true);
assert(isValidDate('20081329')===false);
assert(isValidDate('20081131')===false);
assert(isValidDate(20080229)===true);
assert(isValidDate(20081329)===false);
assert(isValidDate(20081131)===false);
}
isValidDate.test();
用JavaScript校验日期的合法性的更多相关文章
- PHP校验日期格式是否合法
在后端开发中,我们常常需要校验前端传入参数的合法性,如果是校验日期参数,我们可以通过下面的方法来校验: /** * 校验日期格式是否合法 * @param string $date * @param ...
- Java中校验身份证号合法性(真伪),获取出生日期、年龄、性别、籍贯
开发过程中有用的身份证号的业务场景,那么校验身份证的合法性就很重要了,另外还有通过身份证获取出生日期.年龄.性别.籍贯等信息, 下面是本人在开发中用到的关于校验身份证真伪的工具类,可以直接拿来使用,非 ...
- JavaScript校验图片格式及大小
<!DOCTYPE html> <html> <head> <title>JavaScript校验图片格式及大小</title> <s ...
- 通过javascript的日期对象来得到当前的日期,并输出--内置对象---JS
//通过javascript的日期对象来得到当前的日期,并输出. var mydate = new Date(); var week = ["星期日","星期一" ...
- JavaScript校验网址
JavaScript校验网址 var linkUrl = 'https://www.baidu.com' if( typeof (linkUrl) != undefined && li ...
- javascript 时间日期处理相加,减操作方法js
javascript 时间日期处理相加,减操作方法js function dateAddDays(dataStr,dayCount){ var strdate = dataStr; // 2017年0 ...
- JavaScript校验身份证,包含省份、长度、出生年月日、校验位的检测、性别、年龄
一.代码如下 let vcity = {11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江 ...
- 两行代码搞定 JavaScript 的日期验证
我们通常在 JavaScript 中验证日期,基本的思路大概是,先判断年月日是否有效,再判断当月是否有当日,比如一些月份没有 31 日,平年二月没有 29.30 日,闰年二月没有 30 日等等. 偶然 ...
- [JavaScript]配置日期选择控件
我选择的日期控件是:bootstrap-datepicker(下载路径:https://github.com/Aymkdn/Datepicker-for-Bootstrap) 比较方便,实用.原来是英 ...
随机推荐
- 洛谷4245:【模板】任意模数NTT——题解
https://www.luogu.org/problemnew/show/P4245 给两个多项式,求其乘积,每个系数对p取模. 参考: 代码与部分理解参考https://www.luogu.org ...
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- React Patterns
Contents Stateless function JSX spread attributes Destructuring arguments Conditional rendering Chil ...
- 高效率JavaScript代码的编写技巧
使用DocumentFragment优化多次append 添加多个dom元素时,先将元素append到DocumentFragment中,最后统一将DocumentFragment添加到页面.该做法可 ...
- ACE前摄器Proactor模式
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html 当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web ...
- Bigbluebutton服务执行过程及相关配置文件
BigBlueButton服务列表 BigBlueButton由许多开源的服务组成,看似很麻烦,实际上拆分开每一个服务就很简单了,组件化平台化.究竟BBB都用到了哪些开源服务?我们来列举一下,名称均带 ...
- 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance
引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...
- eclipse如何远程debug/断开远程debug
eclipse如何远程debug? 当你的代码已经部署到生产或者测试环境的时候,你如何debug判断线上的问题呢? debug之前必须保证本地代码和远程代码完全一致,否则将不能建立连接 在eclips ...
- 【设计模式】 模式PK:抽象工厂模式VS建造者模式
1.概述 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可.而建造者模式则是要求按 ...
- Linux目录结构nginx
alias 别名( 永久 ) 1.vim /root/.bashrc 2. alias vimens33='vim /etc/sysconfig/network-scripts/ifcfg-ens33 ...