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