2013-02-04 260 views
6

我有一個文本字段,其中用戶輸入的日期時間格式爲:dd/mm/YYYY hh:ii。我想檢查這是否是一個有效的日期時間使用JavaScript。這應該包括二月29日和一切。我怎樣才能做到這一點?由於特殊的月份,正則表達式不會成功。JS檢查有效的日期格式

+0

如果您使用JQuery看到:http://jqueryui.com/datepicker/ – QuentinUK

+0

@RachelGallen請提交此作爲一個答案。 QuentinUK:這很好,但不是我所要求的。 – Keelan

+0

@CamilStaps - 完成! –

回答

3

請參閱http://internotredici.com/article/checkdateinjavascript/瞭解有關檢查時間的有用文章 - 正是您想要的!

下面

是文章

入住日期的全文在JavaScript 條下腳本 程序員經常需要驗證插入信息表格並檢查其正確性於2006年1月31日公佈的是從JavaScript有用乘虛而入。本教程將解釋如何使用JavaScript來驗證日期是否有效。 表單中的日期以兩種不同的方式插入,第一種使用文本字段,其中用戶輸入不同模式的數據(本教程中我們假設日期格式爲dd-mm-yyyy);第二個使用下拉菜單。第一種解決方案更容易實現,但用戶可能會遇到更多錯誤(例如,插入無效字符或更頻繁地使用與已計劃格式不同的格式輸入日期)。現在,我們有以下的文本字段 假設中,我們要插入的DD-MM-yyyy格式的日期:

<form id="test_form" action="get" method="/checkdatejavascript" 
onsubmit="return(check_form(this)); return false;"> 
<input type="text" name="datefield" id="datefield" /> 
</form> 

要檢查插入數據的正確性,我們將使用check_form功能:

function check_form() 
{ 
// Regular expression used to check if date is in correct format 
var pattern = new RegExp([0-3][0-9]-(0|1)[0-9]-(19|20)[0-9]{2}); 
if(document.getElementById('datefield').value.match(pattern)) 
{ 
    var date_array = document.getElementById('datefield') 
        .value.split('-'); 
    var day = date_array[0]; 

    // Attention! Javascript consider months in the range 0 - 11 
    var month = date_array[1] - 1; 
    var year = date_array[2]; 

    // This instruction will create a date object 
    source_date = new Date(year,month,day); 

    if(year != source_date.getFullYear()) 
    { 
    alert('Year is not valid!'); 
    return false; 
    } 

    if(month != source_date.getMonth()) 
    { 
    alert('Month is not valid!'); 
    return false; 
    } 

    if(day != source_date.getDate()) 
    { 
    alert('Day is not valid!'); 
    return false; 
    } 
} 
else 
{ 
    alert('Date format is not valid!'); 
    return false; 
} 

return true; 

} 正如我們所看到的,用藍色表示的正則表達式用於控制插入日期是否遵循默認分配格式。如果模式有效,則函數繼續執行下一步,否則會引發錯誤消息。abd表單不發送(正則表達式保證此日期不能爲空)。 驗證日期我們將使用JavaScript提供的Date對象。 (檢查以紅色證明的代碼)。該算法非常簡單。使用用戶插入的信息,我們將創建一個Date對象,並使用getFullYear,getMonth和getDate方法,我們將生成三個值,分別表示與其關聯的年份,月份和日期。如果這些值等於用戶插入的值,那麼日期是正確的。現在考慮下面的例子:

用戶插入的文本字段從字符串創建的字符串1976年9月1日 Date對象是1976年9月1日 日期是有效的

用戶插入的文本字段中的字符串31從字符串創建-02-2006 Date對象是2006年3月3日 日期是無效

程序員不得不採取特別注意(檢查綠色證明的代碼)在JavaScript處理日期的方式,因爲幾個月被認爲是在0到11的範圍內,假設o是1月,11是12月。 在下拉菜單的情況下,使用插入日期,控制是更簡單的,由於這樣的事實,正則表達式並不需要驗證日期格式:

<form id="test_form" action="get" method="/checkdatejavascript" 
    onsubmit="return(check_form(this)); return false;"> 
    <select name="dateday" id="dateday"> 
    <option value="1">1</option> 
    […] 
    </select> 
    <select name="datemonth" id="datemonth"> 
    <option value="0">January</option> 
    […] 
    </select> 
    <select name="dateyear" id="dateyear"> 
    <option value="2006">2006</option> 
    […] 
    </select> 
    </form> 

將CONTROLL日期正確性JavaScript函數是

function check_form() 
{ 
var day = document.getElementById('dateday').value; 
var month = document.getElementById('datemonth').value; 
var year = document.getElementById('dateyear').value; 

// This instruction will create a date object 
source_date = new Date(year,month,day); 

if(year != source_date.getFullYear()) 
{ 
    alert('Year is not valid!'); 
    return false; 
} 

if(month != source_date.getMonth()) 
{ 
    alert('Month is not valid!'); 
    return false; 
} 

if(day != source_date.getDate()) 
{ 
    alert('Day is not valid!'); 
    return false; 
} 

return true; 
} 

更新:我更新了代碼,因爲正則表達式存在問題。感謝Alex的建議

+0

如果鏈接關閉,這個答案是無用的。 – Mathletics

+0

@Mathletics我用完整的代碼更新了答案。 –

1

如果你不想使用其他外部庫,你可以使用下面的功能:

var validateDate = function(dateTime){ 
    var f_date = dateTime.split(" ")[0].split("/").reverse().join("/"); 
    var time = dateTime.split(" ")[1]; 

    var date = dateTime.split(" ")[0].split("/").map(function(c, i, a){ 
     return parseInt(c); 
    }); 
    var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; 
    if ((!(date[2] % 4) && date[2] % 100) || !(date[2] % 400)) { 
    console.log("inside"); 
    daysInMonth[1] = 29; 
    } 

    if(date[0] > 0 && (date[0] <= daysInMonth[(date[1]-1)]) && date[1] > 0 && date[1] <= 12){ 
    return new Date(f_date + " " + time) != "Invalid Date"; 
    } 
    return false; 
} 

這會照顧閏年的變化也。只有輸入格式爲dd/mm/YYYY hh:ii時,此功能纔有效。 你可以嘗試一些像這樣的採樣輸入:

validateDate("29/2/2000 12:30"); // Should return true 
validateDate("29/2/2001 12:30"); // Should return false 
validateDate("32/8/2000 12:30"); // Should return false 
validateDate("30/11/2000 12:30"); // Should return true 
validateDate("31/4/2000 12:30"); // Should return false 
validateDate("15/7/2000 12:77"); // Should return false