用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) 比较方便,实用.原来是英 ...
随机推荐
- [洛谷P3975][TJOI2015]弦论
题目大意:求一个字符串的第$k$大字串,$t$表示长得一样位置不同的字串是否算多个 题解:$SAM$,先求出每个位置可以到达多少个字串($Right$数组),然后在转移图上$DP$,若$t=1$,初始 ...
- 51NOD 1149:Pi的递推式——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1149 F(x) = 1 (0 <= x < 4) F(x) ...
- LOJ6388:[THUPC2018]赛艇——题解
https://loj.ac/problem/6388 如果你做过BZOJ5217:[Lydsy2017省队十连测]航海舰队的话,那么恭喜你,这道题就是大水题. 如果你做过BZOJ4259:残缺的字符 ...
- ubuntu14.04安装GTX 1080 ti遇到黑屏问题
实验室给我配置了一个1080ti的卡,那个激动,windows下1000+的FPS,跑分40W,无敌,言归正传,ubuntu14.04下配nvidia 1080的驱动还是出现了很多问题,差点就要重装系 ...
- eclipse ----- indexer
使能indexer,可以实现变量.函数等的跳转, 即跳转到定义的位置
- c# 合并两个有序数组
, , , , , }; , , , }; ArrayList lists = new ArrayList(); ArrayList temp = new ArrayList(); lists.Add ...
- mysql5.6以上(适用5.7)免安装版本 终极配置
1.解压你的mysql5.6 我解压的位置是D:\Program Files\mysql--winx64,你可以随意放在任何位置,不建议解压到C盘 2.来到你解压的文件根目录下,新建一个my.ini文 ...
- Rabbit MQ 面试题相关
项目中的MQ: #rabbitmq spring.rabbitmq.host=127.0.0.1 主机 spring.rabbitmq.port=5672 端口 spring.rabbitmq.use ...
- 51Nod 1344 走格子 | 贪心
Input示例 5 1 -2 -1 3 4 Output示例 2 贪心 #include <bits/stdc++.h> using namespace std; typedef long ...
- LightOJ 1284 - Lights inside 3D Grid 概率/期望/二项式定理
题意:给你一个长宽高为x,y,z的长方体,里面每个格子放了灯,再给你k次选取任意长方体形状的区块,对其内所有灯开或关操作,初始为关,问亮灯数量的期望值. 题解:首先考虑选取区块的概率,使某个灯在被选取 ...