Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript有效日期检查在IE8(和Firefox)中不起作用_Javascript_Jquery - Fatal编程技术网

Javascript有效日期检查在IE8(和Firefox)中不起作用

Javascript有效日期检查在IE8(和Firefox)中不起作用,javascript,jquery,Javascript,Jquery,为了检查有效日期,我尝试了来自的两个流行答案。我在IE8中对它们进行了测试——不幸的是,它们都令人失望。看到这里了吗 有更好的JavaScript代码可以在IE8+Chrome+Firefox中使用吗 注意:令我惊讶的是,它在Firefox中也不能很好地工作 条件 日期格式应为带斜杠(/)的美国日期格式 代码 isValidDateCheck2('12/33/2012') ; isValidDateCheck1('12/12/2012') ; function isValidDateChec

为了检查有效日期,我尝试了来自的两个流行答案。我在IE8中对它们进行了测试——不幸的是,它们都令人失望。看到这里了吗

有更好的JavaScript代码可以在IE8+Chrome+Firefox中使用吗

注意:令我惊讶的是,它在Firefox中也不能很好地工作

条件

日期格式应为带斜杠(/)的美国日期格式

代码

isValidDateCheck2('12/33/2012') ;
isValidDateCheck1('12/12/2012') ;

function isValidDateCheck1(d) 
{
  alert(Object.prototype.toString.call(d));
  if ( Object.prototype.toString.call(d) !== "[object Date]" )
  {
    alert('Not Valid');
  }
  if(!isNaN(d.getTime()))
  {
  alert(d.getTime());
  }
  }

  function  isValidDateCheck2(d)
  {    
    var timestamp=Date.parse(d);
    alert(timestamp);

    if (isNaN(timestamp)==false)
    {
        var date=new Date(timestamp);
        alert(date);                    
    }
   }
function isValidDate(s) 
{
var bits = s.split('/');

if(s.indexOf(' ') != -1)
{
    //White space exists in the original date string
    return false;
}

//Javascript month starts at zero
var d = new Date(bits[2], bits[0] - 1, bits[1]);


if ( isNaN( Number(bits[2]) ) ) 
{
    //Year is not valid number
    return false;
}

if ( Number(bits[2]) < 1 ) 
{
    //Year should be greater than zero
    return false;
}



//1. Check whether the year is a Number
//2. Check whether the date parts are eqaul to original date components
//3. Check whether d is valid

return d && ( (d.getMonth() + 1) == bits[0]) && (d.getDate() == Number(bits[1]) );

} 
编辑


@mplungjan方法(首次建议)列在中。在IE8中,有一个场景失败了-。

这将处理实际日期,并让您有机会使用

注意:一些浏览器会乐于解析看似无效的日期,并从中生成日期对象。例如,2013年2月29日将解析为2013年3月1日,因此我的测试旨在查看输入的部件在实际日期中使用时是否有意义

测试

Win7:

  • Chrome 23(只有一家在第一次约会时提供给isNaN)
  • IE 9
Win XP:

  • 外汇17
  • IE 8
  • 狩猎5
  • 歌剧11和12
函数IsValidDataTechCheck(dString){
//测试它是否为nn/nn/nnnn或nn/nn/nn
var dRe=/^(\d{1,2})([\-\/])(\d{1,2})\2(\d{4}\d{2})$/
如果(!数据执行器(数据字符串)){
返回false;
}   
//确保它被解析为日期
//如果不允许破折号,请更换此零件
D字符串。替换(/-/g,“/”);
var date=new date(dString);//创建一个日期对象
如果(!isNaN(date)){//可能会给出NaN-如果不测试零件
var parts=dString.split(“/”;//斜线分割
var dd=parseInt(部分[1],10);//天数
var mm=parseInt(parts[0],10)-1;//月-JS月从0开始
var yyyy=parseInt(第[2]部分,第10部分);//年
//如果所有部分匹配,则返回true
返回dd==date.getDate()&&mm==date.getMonth()&&yyyy==date.getFullYear();
}
//此处日期未解析为日期
返回false;
}
window.onload=function(){
document.getElementById(“输出”).innerHTML+=”
2012年12月33日:“+IsValidDataTechCheck('12/33/2012'); document.getElementById(“输出”).innerHTML+=”
2012年12月12日:“+IsValidDataTechCheck('12/12/2012'); document.getElementById(“输出”).innerHTML+=”
2012年2月29日:“+IsValidDataTechCheck('2012年2月29日'); document.getElementById(“输出”).innerHTML+=”
2013年2月29日:“+IsValidDataTechCheck('2013年2月29日'); document.getElementById(“输出”).innerHTML+=”
01/01/2013A:“+IsValidTechCheck('01/01/2013A'); }
感谢@mplungjan。我对这个答案投了赞成票

@mplungjan方法(首次建议)列在中。这在IE8中失败了一个场景-

因此,我在引用之后使用了一种稍微不同的方法。看到这里了吗

编辑

请参阅处理空格的方案

使用这种方法,请随时提出您的建议/挑战

参考资料

  • 代码

    isValidDateCheck2('12/33/2012') ;
    isValidDateCheck1('12/12/2012') ;
    
    function isValidDateCheck1(d) 
    {
      alert(Object.prototype.toString.call(d));
      if ( Object.prototype.toString.call(d) !== "[object Date]" )
      {
        alert('Not Valid');
      }
      if(!isNaN(d.getTime()))
      {
      alert(d.getTime());
      }
      }
    
      function  isValidDateCheck2(d)
      {    
        var timestamp=Date.parse(d);
        alert(timestamp);
    
        if (isNaN(timestamp)==false)
        {
            var date=new Date(timestamp);
            alert(date);                    
        }
       }
    
    function isValidDate(s) 
    {
    var bits = s.split('/');
    
    if(s.indexOf(' ') != -1)
    {
        //White space exists in the original date string
        return false;
    }
    
    //Javascript month starts at zero
    var d = new Date(bits[2], bits[0] - 1, bits[1]);
    
    
    if ( isNaN( Number(bits[2]) ) ) 
    {
        //Year is not valid number
        return false;
    }
    
    if ( Number(bits[2]) < 1 ) 
    {
        //Year should be greater than zero
        return false;
    }
    
    
    
    //1. Check whether the year is a Number
    //2. Check whether the date parts are eqaul to original date components
    //3. Check whether d is valid
    
    return d && ( (d.getMonth() + 1) == bits[0]) && (d.getDate() == Number(bits[1]) );
    
    } 
    
    函数是有效的
    {
    变量位=s.split('/');
    如果(s.indexOf(“”)!=-1)
    {
    //原始日期字符串中存在空白
    返回false;
    }
    //一个月从零开始
    var d=新日期(位[2],位[0]-1,位[1]);
    if(isNaN(数字(位[2]))
    {
    //年份不是有效的数字
    返回false;
    }
    if(数字(位[2])<1)
    {
    //年份应大于零
    返回false;
    }
    //1.检查年份是否为数字
    //2.检查日期部件是否与原始日期部件相同
    //3.检查d是否有效
    返回d&((d.getMonth()+1)=位[0])&&(d.getDate()==数(位[1]);
    } 
    

    你似乎把两件事混为一谈了。有效日期对象和有效日期。这些都不是同一个问题

    回答如何测试日期对象的有效性(日期对象是否为“无效日期”实例)。当您在构造无效参数时使用这些参数时,会生成无效的日期对象:
    newdate(“?”)

    您想要的是测试日期字符串是否符合预定义的日期格式。这是一个完全不同的问题,不应该只使用日期对象来解决

    一般来说,这有几个原因;首先,浏览器将有助于计算溢出月/日/时间到正确的日期:
    新日期(2012,0290)
    ==2012年10月6日

    其次,因为解析器可能依赖于语言环境(mm/dd与dd/mm?)。当浏览器解析日期时,我的区域设置可能会导致它将其滚动到我的时区/DST,从而使其倾斜并扰乱检测(
    .getDate
    现在可能会在第二天返回)。更糟糕的是,这种情况可能只发生在一年中的某些时段的某些时区

    我强烈鼓励使用图书馆我喜欢处理这些东西,因为!如果您必须亲自验证,那么我建议您详细执行以下操作:

    函数isValidDate(str){
    //解析为数字
    常量rm=str.split('/');
    常数m=1*rm[0];
    常数d=1*rm[1];
    常数y=1*rm[2];
    if(isNaN(m*d*y)){
    返回false;
    }
    //天不可能是零
    if(d<1){
    返回false;
    }
    //月份必须为1-12
    如果(m<1 | | m>12){
    返回false;
    }
    //二月
    如果(m==2){
    常量isLeapYear=((y%4==0)和&(y%100!==0))| |(y%400==0);
    //闰年
    如果(isLeapYear&d>29){
    返回false;
    }
    //非闰年
    如果(!isLeapYear&&d>28){
    返回false;
    }
    }
    //其他月份测试
    否则如果(
    (m==4 | | m==6 | | m==9 | | m==11)和&d>30)||
    (m==1 | | m==3 | | m==5 | | m==7 | | m==8 | | m==10 | | m==12&&d>31))