2013-05-01 88 views
0

检查字段:javascript日期验证 - 一年句号

checkFields = function() { 
    var colCheck = 0; 
    var colArray = []; 
    var colDupArray = []; 
    var iDate = $("check_date").value; 
    if(iDate.length > 0) { 
    var a = iDate.split("/"); 
    if(isValidDate(a[0],a[1]-1,a[2]) == false){ 
     alert("You have entered an invalid date. Please amend!"); 
     return false; 
    } 

验证:

isValidDate = function(day,month,year) { 
    var dteDate; 
    dteDate=new Date(year,month,day); 

    var day = dteDate.getDate(); 
    var month = dteDate.getMonth() + 1; 
    var year = dteDate.getFullYear(); 

    var formatted = 
     (day < 10 ? "0" : "") + day + "/" + 
     (month < 10 ? "0" : "") + month + "/" + 
     year; 

    return 
+day === dteDate.getDate() && 
+month === dteDate.getMonth() && 
+year === dteDate.getFullYear(); 
} 

的问题是,我的代码被接受的日期,如“03.06.2012”的时候,我只希望它接受数字之间的斜线。

当我只想要四位数年份时,它也接受“03/06/12”。

任何想法?

+0

为什么不使用您的格式化程序来呈现有效的日期到您的文本? 您正试图根据您的格式验证文本字段。 http://stackoverflow.com/questions/3605214/javascript-add-leading-zeroes-to-date/16314504#16314504 – 2013-05-01 14:47:18

+0

请参阅http://stackoverflow.com/questions/51224/regular-expression-to-match灵感也有效日期 – Aprillion 2013-05-01 15:04:41

+0

你的'isValid'功能已经完全搞砸了。这只是一个C&P错误或您正在使用的实际代码?它永远不会返回“真”。 – Bergi 2013-05-01 15:07:24

回答

1

你会莫名其妙地混合了验证功能的格式。这是它应该如何:

function isValidDate(day,month,year) { 
    var dteDate = new Date(year,month,day); 

    return +day === dteDate.getDate() 
     && +month === dteDate.getMonth() 
     && +year === dteDate.getFullYear(); 
} 
function formatDate(dteDate) { 
    var day = dteDate.getDate(), 
     month = dteDate.getMonth() + 1, 
     year = dteDate.getFullYear(); 

    var formatted = (day < 10 ? "0" : "") + day + "/" 
        + (month < 10 ? "0" : "") + month + "/" 
        + year; 
    return formatted; 
} 
1

至少在四位数年的问题,看this jfiddle输出代码:

d1 = new Date(1,2,3); 
d2 = d1.getFullYear(); 
d3 = d1.getMonth(); 
d4 = d1.getDay(); 
alert(d2); 
alert(d3); 
alert(d4); 

Date构造函数不严格大约四个年份数字(不管什么Mozilla的说you should do)。在上面的例子中,它甚至将int 1作为一年!这反映在您的计划接受的年份不是4个字符的长度。

也许测试一年字符串的长度?

至于拆分,也许你可以使用正则表达式,将分裂确保你只接受斜线(建议here)?

+1

'新的日期(完整的,月份(从零开始),日期)'??? – Bergi 2013-05-01 15:02:50

+0

谢谢@Bergi!我的参数的原始顺序不好。 – arturomp 2013-05-01 15:09:20

+0

但是你还在进入第13个月?这就是为什么它提示'14',顺便说一句。 – Bergi 2013-05-01 15:10:35

2

如上所述,让我们让用户以选择的格式输入日期。输出应该如你所想。

我已经扩展我的小演示与Date.prototype.formatDateField和一个名为moment这似乎也很干净的库。作为第三个选项,jQuery-UI仍然不是防弹的,也许你应该找一个可以为你处理格式的日期选择器。解决您的问题imho的最佳解决方案。

如果你想要去定制然而,这可能让你开始:

// prototype 
Date.prototype.formatDateField = function (options) { 
    var i = 0, 
     date = [], 
     len = date.push(this.getDate(), this.getMonth() + 1, this.getFullYear()); 

    for (; i < len; i += 1) { 
     var chunk = date[i]; 
     date[i] = chunk < 10 ? options.pad + chunk : chunk; 
    } 

    return date.join(options.separator); 
}; 

// Setup output 
var cfg = { 
    fieldDate: "#fieldDate", 
    options: { 
     pad: "0", 
     format: "dd/MM/yyyy", 
     separator: "/" 
    } 
}; 

// function to call 
function reformatInput(){ 
    $(cfg.date).blur(function(){ 
     var moment = moment(this.value).calendar(cfg.options2.format), 
      prot = new Date(this.value).formatDateField(cfg.options2), 
      jqueryui = $.datepicker.formatDate(cfg.options2.format, new Date(this.value)); 

     $(cfg.fieldDate1).val(moment); 
     $(cfg.fieldDate2).val(prot); 
     $(cfg.fieldDate3).val(jqueryui); 
    }); 
} 

// run on demand 
reformatInput(); 

演示:http://jsfiddle.net/tive/YvdKA/

+0

+1上moment.js。一旦你掌握了它,它可以是光荣的。 (它的网站也非常出色。) – arturomp 2013-05-02 16:07:21