寻寻觅觅,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. Chapter 8 工厂方法模式

    工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行.你想要加功能,本来是改工厂类的,而现在是修改 ...

  2. Android Matrix(坐标矩阵)

    Android Matrix 2016-02-26 14:38:10 介绍 中文名:坐标矩阵 高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matr ...

  3. CodeIgniter 应用开发笔记 - 3

    使用migration建数据表 一.新建migrations文件夹 在application新建一个文件夹migrations,存放建表类. 建表类使用用户手册中的代码作为模板(user_guide/ ...

  4. BZOJ 2599 [IOI2011]Race【Tree,点分治】

    给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...

  5. 【模式识别】SVM核函数

    下面是几种经常使用的核函数表示: 线性核(Linear Kernel) 多项式核(Polynomial Kernel) 径向基核函数(Radial Basis Function) 也叫高斯核(Gaus ...

  6. HFS - 简单的将个人电脑变服务器!

    网络硬盘   HTTP File Server(HFS)是我目前所知道的最简便的P2P文件分享方式,只一个大小为559KB的单文件绿色软件(hfs.exe)就可以在瞬间不经过任何系统设置将一台普通的联 ...

  7. 网页制作之html基础学习4-格式与布局

    1.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角弹窗 例: <head> <title>123</title> <sty ...

  8. 读取sd卡下图片,由图片路径转换为bitmap

    public Bitmap convertToBitmap(String path, int w, int h) {             BitmapFactory.Options opts = ...

  9. 基于visual Studio2013解决算法导论之008快速排序算法

     题目 快速排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  10. 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理

    承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理