用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) 比较方便,实用.原来是英 ...
随机推荐
- FPGA学习记录_设计一个计数器
此处设计一个数器,使 学习板上 的 LED 状态每 500ms翻转一次. 学习板上晶振为50MHz,也就是说时钟周期为 20ns , 这样可以计算得出 500ms = 500_000_000ns/20 ...
- bzoj 4069 [Apio2015]巴厘岛的雕塑 dp
[Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 494 Solved: 238[Submit][Status][Dis ...
- oepncv-学习笔记一
安装opencv文件时若需要cmake编译,如果中间出现 解决办法是: 在opencv的文件中找到包含cmakelist.txt的文件夹,把where is the source code:的路径改成 ...
- POJ 2976 二分
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12515 Accepted: 4387 D ...
- SDUT 3930 线段树
皮卡丘的梦想2 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一天,一只住在 501 实验 ...
- ARM指令集、Thumb指令集、Thumb-2指令集
MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集: 编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在 ...
- STM32 - 软件设置单片机重启
__set_FAULTMASK();//关闭总中断 NVIC_SystemReset();//请求单片机重启 执行NVIC_SystemReset()函数不允许被打断,所以关总中断
- 游戏编程入门之测试Xbox360控制输入
代码: #include<Windows.h> #include<d3d9.h> #include<d3dx9.h> #include<Xinput.h> ...
- 求逆元的两种方法+求逆元的O(n)递推算法
到国庆假期都是复习阶段..所以把一些东西整理重温一下. gcd(a,p)=1,ax≡1(%p),则x为a的逆元.注意前提:gcd(a,p)=1; 方法一:拓展欧几里得 gcd(a,p)=1,ax≡1( ...
- 51nod 1486 大大走格子——dp
有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 20 ...