2013-02-04 59 views
6

Tôi có trường văn bản nơi người dùng nhập ngày giờ theo định dạng: dd/mm/YYYY hh:ii. Tôi muốn kiểm tra xem đây có phải là ngày giờ hợp lệ không bằng javascript. Điều này nên bao gồm ngày 29 tháng 2 và mọi thứ. Làm thế nào tôi có thể làm điều đó? Một regex sẽ không thành công do những tháng đặc biệt.JS kiểm tra định dạng ngày hợp lệ

+0

Nếu bạn sử dụng JQuery xem: http://jqueryui.com/datepicker/ – QuentinUK

+0

@RachelGallen xin vui lòng gửi này như một câu trả lời. QuentinUK: nó đẹp, nhưng không phải những gì tôi yêu cầu. – Keelan

+0

@CamilStaps - đã hoàn tất! –

Trả lời

3

xem http://internotredici.com/article/checkdateinjavascript/ để có bài viết hữu ích về kiểm tra thời gian - chỉ những gì bạn muốn!

dưới đây là toàn văn của bài viết

Kiểm tra ngày trong javascript Điều được công bố trên 31 tháng một năm 2006 dưới Scripting Các lập trình viên rất thường xuyên cần phải xác nhận thông tin đưa vào hình thức và để kiểm tra tính đúng đắn của họ là tận dụng lợi thế hữu ích từ javascript . Hướng dẫn này sẽ giải thích cách sử dụng javascript để xác minh xem ngày có hợp lệ hay không. Ngày tháng trong các biểu mẫu được chèn theo hai cách khác nhau, lần đầu tiên sử dụng trường văn bản nơi người dùng nhập dữ liệu theo các mẫu khác nhau (trong hướng dẫn này, chúng tôi giả sử ngày tháng ở định dạng dd-mm-yyyy); thứ hai sử dụng các menu kéo xuống. Giải pháp đầu tiên đơn giản hơn để thực hiện, nhưng phải chịu nhiều lỗi hơn bởi người dùng (ví dụ chèn ký tự không hợp lệ hoặc ngày nhập thường xuyên hơn ở định dạng khác với định dạng đã được lên kế hoạch). Giả sử bây giờ mà chúng tôi có các lĩnh vực văn bản sau đây trong đó chúng ta muốn chèn một ngày ở định dạng 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> 

Để kiểm tra tính chính xác của dữ liệu được chèn chúng tôi sẽ sử dụng chức năng 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; 

} Như chúng ta có thể thấy, biểu thức chính quy được chứng minh bằng màu xanh dương được sử dụng để kiểm soát nếu ngày được chèn theo sau hay không theo định dạng được gán mặc định. Nếu mẫu là hợp lệ thì chức năng tiến hành bước tiếp theo nếu không một thông báo lỗi được đưa ra dưới dạng abd sẽ không được gửi đi (biểu thức chính quy đảm bảo rằng ngày đó không thể để trống). Để xác thực ngày, chúng tôi sẽ sử dụng đối tượng Date được cung cấp bởi javascript. (kiểm tra mã được chứng minh bằng màu đỏ). Thuật toán khá đơn giản. Sử dụng các thông tin được chèn bởi người dùng, chúng ta sẽ tạo một đối tượng Date và sử dụng các phương thức getFullYear, getMonth và getDate chúng ta sẽ tạo ra ba giá trị đại diện cho năm tương ứng, tháng và ngày kết hợp với nó. Nếu các giá trị này bằng với giá trị được chèn bởi người dùng thì ngày đó là chính xác. Xem xét tại các ví dụ sau:

tài chèn trong lĩnh vực văn bản chuỗi 1976/09/01 ngày đối tượng được tạo ra từ chuỗi là 1976/09/01 ngày là hợp lệ

tài chèn trong lĩnh vực văn bản chuỗi 31 -02-2006 Đối tượng ngày được tạo từ chuỗi là 03-03-2006 Ngày không hợp lệ

Lập trình viên phải đặc biệt chú ý (kiểm tra mã được chứng minh bằng màu xanh lá cây) theo cách javascript xử lý ngày tháng, vì tháng được xem xét trong khoảng từ 0 đến 11 giả sử rằng o là tháng 1 và 11 là tháng 12. Trong trường hợp của các menu thả xuống được sử dụng để chèn ngày, điều khiển rất đơn giản hơn do thực tế là biểu thức chính quy không cần phải xác nhận định dạng ngày:

<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> 

Chức năng javascript mà sẽ controll ngày đúng đắn là

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; 
} 

Cập nhật: Tôi đã cập nhật mã, vì có sự cố với cụm từ thông dụng.Cảm ơn Alex vì lời khuyên

+0

Nếu liên kết bị hỏng, câu trả lời này là vô ích. – Mathletics

+0

@Mathletics tôi đã cập nhật câu trả lời với mã đầy đủ. –

1

Nếu bạn không muốn sử dụng thư viện bên ngoài khác mà bạn có thể sử dụng chức năng sau:

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; 
} 

này sẽ chăm sóc của các biến thể năm nhuận cũng có. Chức năng này sẽ chỉ hoạt động nếu đầu vào ở định dạng dd/mm/YYYY hh:ii. Bạn có thể thử một số đầu vào mẫu như thế này:

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 
Các vấn đề liên quan