2013-05-01 90 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