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ệ
Trả lời
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
Nếu liên kết bị hỏng, câu trả lời này là vô ích. – Mathletics
@Mathletics tôi đã cập nhật câu trả lời với mã đầy đủ. –
Nếu sử dụng moment.js là ok, bạn có thể kiểm tra http://momentjs.com/docs/#/parsing/string-format/ để biết các tiện ích phân tích ngày giờ. Ví dụ:
moment("29/02/2014 11:45", "DD/MM/YYYY hh:mm", true).isValid()
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
- 1. kiểm tra ngày hợp lệ với phương pháp DateTime.TryParse
- 2. Kiểm tra nếu một ngày là hợp lệ trong javascript
- 3. Định dạng ngày trong D3.js
- 4. Kiểm tra một số định dạng ngày bằng DateTime.TryParse()
- 5. Kiểm tra IMEI hợp lệ
- 6. Kiểm tra xem biến có phải là ngày hợp lệ với PHP
- 7. Định dạng ngày giờ Sự cố: Chuỗi không được nhận dạng là DateTime hợp lệ
- 8. Định dạng tháng và năm sử dụng NSDateFormatter trả về ngày không hợp lệ
- 9. Kiểm tra gravatar hợp lệ (PHP)
- 10. T-SQL: kiểm tra định dạng email
- 11. Kiểm tra định dạng chuỗi python?
- 12. Kiểm tra ngày trong JavaScript
- 13. Định dạng ngày JAVA
- 14. định dạng ngày tháng jquery ui định dạng ngày tháng
- 15. Thư viện highcharts js chấp nhận định dạng nào cho ngày?
- 16. Làm cách nào để kiểm tra định dạng ngày của chuỗi trong PHP?
- 17. Thymeleaf - Thực hành tốt nhất để kiểm tra NULL khi định dạng (ví dụ: ngày)
- 18. Hàm IsDate trong SQL đánh giá các ngày không hợp lệ là hợp lệ
- 19. Xác thực định dạng ngày trong php
- 20. php preg_match định dạng ngày "yyyy-MM"
- 21. Định dạng ngày ActiveRecord
- 22. DateTime.Parse ngày định dạng
- 23. Định dạng ngày PHP
- 24. Regex để kiểm tra ngày
- 25. Kiểm tra xem ValidationGroup có hợp lệ từ mã sau
- 26. Kiểm tra chuỗi cho tên thư mục hợp lệ
- 27. Kiểm tra phiên hợp lệ: isRequestedSessionIdValid() vs getSession (false)
- 28. Cách kiểm tra xem phiên không hợp lệ
- 29. Kiểm tra xem đường dẫn có hợp lệ trong Python
- 30. Kiểm tra tính hợp lệ của email trong django/python
Nếu bạn sử dụng JQuery xem: http://jqueryui.com/datepicker/ – QuentinUK
@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
@CamilStaps - đã hoàn tất! –