校验表单时可能会遇到校验日期是否正确。可以利用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]]]]]);

解释如下:

  1. 第一种:根据系统设置,返回当前日期时间。
  2. 第二种:value为整数型,表示从1970年1月1日 00:00:00 距现在所过去的毫秒数。
  3. 第三种:dateString为字符串型,其格式需满足指定格式。
  4. 第四种:各参数都是整数型。

当拿到了被校验日期的年、月、日之后,计算毫秒数或构造日期格式字符串都比较麻烦。所以这里使用第四种。

这时,调用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();

转载于:https://www.cnblogs.com/gymmer/p/6893751.html

用JavaScript校验日期的合法性相关推荐

  1. 日期格式php用点隔离,PHP学习之校验日期格式合法性?(使用strtotime()和date())...

    详细内容 本篇文章主要讲述了用PHP来校验日期格式是否合法,具有一定参考价值,有需要的朋友可以了解一下,希望能帮到你. 在后端开发中,我们常常需要校验前端传入参数的合法性,如果是校验日期参数,我们可以 ...

  2. Java校验日期的合法性

    判断一个日期是否合法,如2022-02-29.2022-13-01就属于不合法日期 public class TEST2 {public static void main(String[] args) ...

  3. Java身份证号脱敏、校验身份证号合法性、根据身份证号获取年龄、根据生日获取年龄

    这里写目录 身份证号编码规则 身份证号脱敏 身份证号合法性校验 根据身份证号获取年龄 根据生日日期获取年龄 根据身份证号获取年龄.生日的Map集合 身份证号编码规则 第一.二位表示省(自治区.直辖市. ...

  4. python判断日期_python如何判断日期的合法性?

    判断日期的合法性,有两层含义,一是日期格式是否合法,二是格式合法后,其所表示的实际的那一天,是否真实存在!在python中,做这个合法性的判断,so easy!~~ 我们需要用到datetime模块中 ...

  5. javascript 操作日期 测试(注意浏览器兼容问题)

      1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  6. python与shell校验IP地址合法性

    python校验IP地址合法性 执行效果: python代码: [root@yang python]# vi check_ip.py #!/usr/bin/python import os,sys d ...

  7. JavaScript校验身份证,包含省份、长度、出生年月日、校验位的检测、性别、年龄...

    一.代码如下 1 let vcity = {11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙 ...

  8. Javascript获取日期和星期

    javascript获取日期,亮点:方法ie跟其他浏览器不同. function getDateWeek() { todayDate = new Date(); date = todayDate.ge ...

  9. 录入年、月、日,判断日期的合法性

    录入年.月.日,判断日期的合法性. 提示:如1 3 5 7 8 10 12最大日期为31,闰年2月最大29,平年28,其余月份最大日期都是30. 如录入 1995年2月29日,则为不合法日期. imp ...

  10. java中正则表达式校验日期,1999-01-01 ,1991\01\01,-分割和\分割两种形式

    今天写代码,我需要校验日期格式,传入的日期是1991\01\01这种类型的. 我百度出来的是1999-01-01 形式的: ^\d{4}-\d{1,2}-\d{1,2} 本来我想着-换成\就行了,这样 ...

最新文章

  1. AI“换脸”打开潘多拉魔盒,如何应对?
  2. 并发编程之Synchronized原理
  3. LeetCode 473. 火柴拼正方形
  4. python中属性与方法_python中属性和方法的动态绑定
  5. 性能测试利器 - Locust框架解析
  6. 在windows7下安装pads2007.4
  7. 短视频SDK:视频编辑SDK,AE模版SDK,绿幕抠图SDK,AI人像分割SDK,VLOG模版SDK
  8. 什么样的会员管理才叫有效果的会员运营方案?
  9. 不良资产处置(四):国内外不良资产处置公司的背景特点
  10. c语言第七章函数实验总结,C语言学习与总结---第七章:函数 [01]
  11. 用60行代码实现一个高性能的圣诞抽抽乐H5小游戏(含源码)
  12. MATLAB语言中int函数
  13. 易点易动【设备管理】产品全新上线
  14. oracle 给表授权grant
  15. django自带模块实现翻页功能
  16. Tomcat配置HTTP协议转HTTPS协议
  17. discuz的php7版本
  18. 敏捷Scrum框架最全总结!
  19. cento网络故障:Job for network.service failed because the control process exited with error code. See sy
  20. linux7team,Centos7 –Team配置

热门文章

  1. Ninth scrum meeting - 2015/11/3
  2. CAKeyframeAnimation简单实用
  3. poj 3278 Catch That Cow (bfs 搜索)
  4. [转] 春晚诗朗诵《心里话》之程序员版!!
  5. 机器学习基础:评价指标(Machine Learning Fundamentals: Evaluation Metrics)
  6. 使用OpenCV需要注意的小细节
  7. 苹果macOS Monterey将支持一键恢复出厂设置,无需重装系统
  8. 视频剪辑软件对比之:会声会影与剪映
  9. 如何在苹果 M1 上安装使用 FL Studio
  10. C# 7.3新特性一览