用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) 比较方便,实用.原来是英 ...
随机推荐
- BZOJ5321 & 洛谷4064 & LOJ2274:[JXOI2017]加法——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5321 https://www.luogu.org/problemnew/show/P4064 ht ...
- C++中友元简介
本文基于<C++ Primer(第五版)>,纯属个人笔记整理.若有错误欢迎大家留言指出. 一.为什么要用友元和其缺点? 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员 ...
- BZOJ1596 [Usaco2008 Jan]电话网络 【树形dp】
题目链接 BZOJ1596 题解 先抽成有根树 设\(f[i][0|1][0|1]\)表示以\(i\)为根,儿子都覆盖了,父亲是否覆盖,父亲是否建塔的最少建塔数 转移一下即可 #include< ...
- LibreOJ #6220. sum(数论+构造)
题目大意:在数组中找出一些数,使它们的和能被n整除 这题标签是数学,那我就标题就写数论好了... 显然如果数组中有n的倍数直接取就行. 那假设数组中没有n的倍数,把数组中的数求前缀和后全部%n,会得到 ...
- Educational Codeforces Round 61 (Rated for Div. 2) D,F题解
D. Stressful Training 题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有n台电脑,每台电脑都有初始电量ai,也有一个 ...
- UVA796:Critical Links(输出桥)
Critical Links 题目链接:https://vjudge.net/problem/UVA-796 Description: In a computer network a link L, ...
- Rectangle 暴力枚举大法
frog has a piece of paper divided into n rows and m columns. Today, she would like to draw a rectang ...
- 前端PHP入门-001-为什么学习PHP?
写在前面的话 可能不知道能坚持多久,现在的我喜欢纯文字的描述! 希望能坚持写完,也是对自己的一个鞭策! 总顾及别人,那谁来顾及你! 为什么学习PHP? PHP入门简单,学习入门易入手[呵呵,都这么说, ...
- Proxmap Sort
这个排序是桶排序和基数排序的改进,理解了前两者,这个排序很容易理解 先回忆下桶排序是怎么回事,它与桶的区别在于入桶规则,桶排序里是1入1号桶,2入2号桶 这个排序把数字分区了,然后给出一个所谓的键,例 ...
- Spring boot集成RabbitMQ(山东数漫江湖)
RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出 ...