寻寻觅觅,Web开发里,对日期的验证太多了,网上好多是用正则表达式来验证,但是这种验证也只能验证格式,没办法验证有效性,比如平年(2月28天)和闰年(2月29天)。平时用得多,以前经常用一次写一次,腻了,所以今天写下来,以后直接Copy,今天提供两个方法:

1.用纯Js代码来验证

这个要注意的也就是对2月份的判断,就是加个Switch...Case而已,就不一一解释,代码中有注释,

这个方法满足以下格式的日期:20100912、2010-01-02、2012/2/2、2012\12\12

先上完整代码(需要的朋友直接复制):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="jquery-1.10.2.js"></script>
<script type="text/javascript">
function btnClick()
{
if (!checkDate(document.getElementById("inputDate")))
{
alert("日期格式错误");
}
else
alert("验证通过");
}
function checkDate(element)//讀取分隔符,日期輸入框的對象
{
var strDate = $(element).val();
var splitStr = "";
if (!checkInt(strDate)) {
for (var i = 0; i < strDate.length; i++) {
if (!checkInt(strDate[i])) {
splitStr = strDate[i];
if (splitStr != "-" && splitStr != "/" && splitStr != "\\")//默认只能有这几种分隔符(因为目前后台代码能转化时间的也就这三种好像                                                  ),需要的自己加
                        {
return false;
}
break;
}
}
}
else//如果是數字,則沒有分隔符,則默認格式為20121011
{
if (strDate.length != 8)
{
return false;
} splitStr = "/";
var s1 = strDate.substring(0, 4) + splitStr;
var s2 = strDate.substring(4, 6) + splitStr;
var s3 = strDate.substring(6, 8);
strDate = s1 + s2 + s3;
}
$(element).val(strDate);//如果沒有分隔符,把分隔符插入之後,賦值給文本框,類似於格式化日期
return validateDate(strDate, splitStr);
} function validateDate(strDate, splitStr) {
splitStr = splitStr.trim();
var year;
var month;
var day;var arr = strDate.split(splitStr);
if (arr.length != 3) {
return false;//不等於三個數字,則分隔符有問題,或者數字有問題;
}
else {
year = arr[0];
month = arr[1];
day = arr[2];
if (!checkInt(year) || !checkInt(month) || !checkInt(day)) {
return false;//輸入了非數字
}
return checkYear(year, month, day);
}
}
function checkInt(num) {//验证是否是纯数字
var reg = /^-?\d+$/;//对正则表达式不熟,知道的朋友帮忙解释下"-?"的意思
if (reg.test(num)) {
return true;
}
else {
return false;
}
}
function checkYear(year, month, day) {//验证平年闰年
var result = true;
year = parseInt(year);
month = parseInt(month);
day = parseInt(day); if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//閏年,2月 29天
{
switch (month) {
case 1: result = (day <= 31); break;
case 3: result = (day <= 31); break;
case 5: result = (day <= 31); break;
case 7: result = (day <= 31); break;
case 8: result = (day <= 31); break;
case 10: result = (day <= 31); break;
case 12: result = (day <= 31); break;
case 4: result = (day <= 30); break;
case 6: result = (day <= 30); break;
case 9: result = (day <= 30); break;
case 11: result = (day <= 30); break;
case 2: result = (day <= 29); break;
default: result = false;
}
}
else//平年,2月 28天
{
switch (month) {
case 1: result = (day <= 31); break;
case 3: result = (day <= 31); break;
case 5: result = (day <= 31); break;
case 7: result = (day <= 31); break;
case 8: result = (day <= 31); break;
case 10: result = (day <= 31); break;
case 12: result = (day <= 31); break;
case 4: result = (day <= 30); break;
case 6: result = (day <= 30); break;
case 9: result = (day <= 30); break;
case 11: result = (day <= 30); break;
case 2: result = (day <= 28); break;
default: result = false;
}
}
return result;
}
</script>
</head>
<body>
<input type="text" id="inputDate" />
<input type="button" onclick="btnClick()" value="验证" />
</body>
</html>

2.将日期字符串转为Date类型

精华只有一句,但是不能支持20141024这种格式,所以如果是输入这种格式,那就给它处理一下,先上精华代码:

return (new Date(strDate).getDate() == strDate.substring(strDate.length - 2));

有了这句,能判断2010-01-02、2012/02/02、2012\12\12这三种格式的日期,缺点就是不能判断20100912这种类型,所以以下对20100912这种类型的数据进行处理,也能用了。这个2012/2/2这种是无法验证的,需要的自己给它加0吧,转为2012/02/02的形式。

这句啥意思我也不懂,不过能用就是了。

给出能支持20100912、2010-01-02、2012/02/02、2012\12\12这四种格式的代码:

<script type="text/javascript">

        function checkDate2(element)//讀取分隔符,日期輸入框的javascript對象
{
var strDate = $(element).val();
var splitStr = "";
if (!checkInt(strDate)) {
for (var i = 0; i < strDate.length; i++) {
if (!checkInt(strDate[i])) {
splitStr = strDate[i];
if (splitStr != "-" && splitStr != "/" && splitStr != "\\") {
return false;
}
break;
}
}
}
else//如果是數字,則沒有分隔符,則默認格式為20121011
{
if (strDate.length != 8) {
return false;
} splitStr = "/";
var s1 = strDate.substring(0, 4) + splitStr;
var s2 = strDate.substring(4, 6) + splitStr;
var s3 = strDate.substring(6, 8);
          if(strDate.substring(4, 6)=="00")//加上这个的原因是,下面那句居然对2014/00/12这个 也会验证通过,所以这边做个特殊处理
          {
            return false;
          }
         strDate = s1 + s2 + s3; $(element).val(strDate);//如果沒有分隔符,把分隔符插入之後,賦值給文本框,類似於格式化日期
      }
      
      return (new Date(strDate).getDate() == strDate.substring(strDate.length - 2));//精华一句 } </script>
 

  

总结:

第二个简洁一点,不过都是可用的。记录下来,以后直接复制黏贴(ˇˍˇ) ,不知道有没有漏掉什么,欢迎批斗

        

js验证日期的更多相关文章

  1. 正则表达式的JS验证

    /判断输入内容是否为空    function IsNull(){        var str = document.getElementById('str').value.trim();      ...

  2. 九月二十八JS验证

    js表单验证 js可用发来在数据被送往服务器前对HTML表单中的这些输入数据进行验证 被js验证的这些典型的表单数据有: >用户是否已填写表单中的必填项目: >用户输入的邮件地址是否是合法 ...

  3. JS对日期时间的操作

    代码: //判断是否超期(有效期开始超过一年后算已超期) function IsEffect(effectDate) { var val = ""; var currentDate ...

  4. 分享我常用的一些JS验证和函数

    下面是我常用一些JS验证和函数,有一些验证我直接写到了对象的属性里面了,可以直接通过对象.方法来调用//浮点数除法运算 function fdiv(a, b, n) { if (n == undefi ...

  5. Js获取日期时间及其它操作

    var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFullYear();    //获取完整的年份(4位,1 ...

  6. 常用JS验证和函数

    下面是我常用一些JS验证和函数,有一些验证我直接写到了对象的属性里面了,可以直接通过对象.方法来调用 //浮点数除法运算 function fdiv(a, b, n) { if (n == undef ...

  7. Js完美验证15/18身份证,Js验证身份证,支持15/18位

    Js完美验证15/18身份证,Js验证身份证,支持15/18位 >>>>>>>>>>>>>>>>> ...

  8. JS时间日期

    JS获取当前时间 var myDate = new Date(); myDate.get[UTC]FullYear();    //获取完整的年份(4位,1970-????)myDate.get[UT ...

  9. JS 操作日期

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...

随机推荐

  1. 将 jsp 页面的值 传到struts2 action中(不是表单中的值)

    JSP: 页面: <%@ page language="java"  pageEncoding="GBK"%> <%@taglib prefi ...

  2. docker学习笔记7:发布镜像到docker hub上

    镜像创建好后,很重要的一个操作就是共享和发布.可以将自己创建的镜像发布到docker hub上,也可以发布到自己的私有docker hub上. 要想发布镜像到dokcer hub上,首先要在dokce ...

  3. 180China丨the Agency for Brand Engagement and Experience

    180China丨the Agency for Brand Engagement and Experience Welcome to 180. Welcome to Creativity. Thank ...

  4. [置顶] Java套接字Socket编程

    1)概念 网络编程基本模型就客户端到服务器的模型,也就是我们常见的C/S模型.简单的说就是两个进程间相互通信的过程.即通信双方一方作为服务器等待客户端提出请求并给以回应,另一方作为客户端向服务器提出请 ...

  5. python idle 错误 subprocess didn&#39;t make connection

    今天打开python idle不反应.然后通过网上搜索让我在安装文件夹下点击idle.py 弹出如图所看到的的错误,进行了非常多尝试.任然没有得到解决.可是在尝试过程中发现了大家所说问题所在都是由于新 ...

  6. SICP中sqrt(开方)的实现(附C#实现)

    #lang racket (define (square x) (* x x)) (define (sqrt-iter guess x) (if (good-enough? guess x) gues ...

  7. sizeof与strlen的区别 浅谈

    1.sizeof operator sizeof是C语言的一种单目操作符,如C语言的其他操作符++.- - 等,它并不是函数. Queries size of the object or type. ...

  8. uva 10330 - Power Transmission(网络流)

    uva 10330 - Power Transmission 题目大意:最大流问题. 解题思路:増广路算法. #include <stdio.h> #include <string. ...

  9. SED修改指定行

    一个文件:cat aa #如果第三行是5的话将改为8,很明显第三行是5所以 结果改变 [root@remote ~]# sed -e '3s/5/8/' aa [root@remote ~]# #如果 ...

  10. KestrelServer

    KestrelServer 跨平台是ASP.NET Core一个显著的特性,而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server.KestrelServer利用一个名为Ke ...