Xác thực rằng ngày kết thúc lớn hơn ngày bắt đầu bằng jQuery


Câu trả lời:


177

Chỉ cần mở rộng câu trả lời hợp nhất. phương pháp mở rộng này hoạt động bằng cách sử dụng plugin xác thực jQuery. Nó sẽ xác thực ngày và số

jQuery.validator.addMethod("greaterThan", 
function(value, element, params) {

    if (!/Invalid|NaN/.test(new Date(value))) {
        return new Date(value) > new Date($(params).val());
    }

    return isNaN(value) && isNaN($(params).val()) 
        || (Number(value) > Number($(params).val())); 
},'Must be greater than {0}.');

Để dùng nó:

$("#EndDate").rules('add', { greaterThan: "#StartDate" });

hoặc là

$("form").validate({
    rules: {
        EndDate: { greaterThan: "#StartDate" }
    }
});

Làm thế nào để bạn sử dụng điều này với hai hộp văn bản?
Cros

1
Tôi đã phải sửa đổi nó một chút để cho phép các ngày kết thúc trống trong ứng dụng của mình, nhưng điều này đã làm được số lượng lớn. codeif (value == 0) {return true; } else if (! / không hợp lệ | NaN / ...code
Frank Luke

3
Cảnh báo BUG: Tôi nhận ra câu hỏi là về ngày tháng, nhưng mã này sẽ không hoạt động đối với các số như được quảng cáo. Tôi đã thêm một câu trả lời giải thích lý do tại sao và cách làm cũng bao gồm cả bản sửa lỗi.
Jon

1
@Cros jQuery.validator.addMethod ("zip_code_checking", function (value, element) {return jQuery ('# zip_endvalue'). Val ()> jQuery ('# zip_startvalue'). Val ()}, "* Kết thúc mã zip giá trị phải lớn hơn giá trị bắt đầu mã Zip ");
Balasuresh Asaithambi

Điều này gây ra lỗi trong Google chrome. Nếu bạn chuyển một giá trị nhỏ hơn 12 hoặc lớn hơn 31, thì nó sẽ được phân tích cú pháp thành một ngày và do đó nó cũng được xác thực như một ngày. Tôi đã phải tách điều này thành hai phương pháp (vội vàng), nhưng tôi muốn tìm một giải pháp phù hợp hơn!
sbsatter

84
var startDate = new Date($('#startDate').val());
var endDate = new Date($('#endDate').val());

if (startDate < endDate){
// Do something
}

Điều đó nên làm điều đó tôi nghĩ


Đúng? Cảm ơn! Không cần plugin. : P
Vael Victus

1
thoải mái và dễ dàng để thực hiện, mặc dù jQuery.validate là tuyệt vời
mknopf

Cảm ơn rất nhiều .. rất dễ dàng.
Nimit Joshi

vấn đề duy nhất là khi bạn có một phạm vi ngày kéo dài trong hai năm, ví dụ. 27-06-2015 đến 2016/02/02 .... nó sẽ không xác nhận đúng
Himansz

Phạm vi ngày như vậy kéo dài trong vòng hai năm, ví dụ. 27-06-2015 đến 02-02-2016, được xác thực phù hợp với tôi.
Thamarai T

19

Đến bữa tiệc hơi muộn nhưng đây là phần của tôi

Date.parse(fromDate) > Date.parse(toDate)

Đây là chi tiết:

var from = $("#from").val();
var to = $("#to").val();

if(Date.parse(from) > Date.parse(to)){
   alert("Invalid Date Range");
}
else{
   alert("Valid date Range");
}

14

Tham chiếu jquery.validate.js và jquery-1.2.6.js. Thêm lớp startDate vào hộp văn bản ngày bắt đầu của bạn. Thêm lớp endDate vào hộp văn bản ngày kết thúc của bạn.

Thêm khối tập lệnh này vào trang của bạn: -

<script type="text/javascript">
    $(document).ready(function() {
        $.validator.addMethod("endDate", function(value, element) {
            var startDate = $('.startDate').val();
            return Date.parse(startDate) <= Date.parse(value) || value == "";
        }, "* End date must be after start date");
        $('#formId').validate();
    });
</script>

Hi vọng điêu nay co ich :-)


tôi thích kỹ thuật này
wahmal

13

Tôi chỉ đang mày mò với câu trả lời của danteuno và thấy rằng mặc dù có ý tốt, nhưng thật đáng buồn là nó đã bị hỏng trên một số trình duyệt không phải là IE. Điều này là do IE sẽ khá nghiêm ngặt về những gì nó chấp nhận làm đối số cho hàm Datetạo, nhưng những người khác thì không. Ví dụ: Chrome 18 cung cấp

> new Date("66")
  Sat Jan 01 1966 00:00:00 GMT+0200 (GTB Standard Time)

Điều này khiến mã sử dụng đường dẫn "so sánh ngày tháng" và tất cả đều đi xuống từ đó (ví dụ: new Date("11")lớn hơn new Date("66")và điều này rõ ràng là ngược lại với hiệu quả mong muốn).

Do đó, sau khi cân nhắc, tôi đã sửa đổi mã để ưu tiên cho đường dẫn "số" hơn đường dẫn "ngày tháng" và xác thực rằng đầu vào thực sự là số bằng phương pháp tuyệt vời được cung cấp trong Xác thực số thập phân trong JavaScript - IsNumeric () .

Cuối cùng, mã trở thành:

$.validator.addMethod(
    "greaterThan",
    function(value, element, params) {
        var target = $(params).val();
        var isValueNumeric = !isNaN(parseFloat(value)) && isFinite(value);
        var isTargetNumeric = !isNaN(parseFloat(target)) && isFinite(target);
        if (isValueNumeric && isTargetNumeric) {
            return Number(value) > Number(target);
        }

        if (!/Invalid|NaN/.test(new Date(value))) {
            return new Date(value) > new Date(target);
        }

        return false;
    },
    'Must be greater than {0}.');

điều này hoạt động tức là nhưng không thể làm cho nó hoạt động trong opera và FF, bất kỳ ý tưởng?
Được mã hóa

: Nó xuất hiện với lỗi xác thực ngay cả khi ngày kết thúc đã chọn sau ngày bắt đầu đã chọn
Được mã hóa

5

Giá trị ngày tháng từ các trường văn bản có thể được tìm nạp bằng phương thức .val () của jquery như

var datestr1 = $('#datefield1-id').val();
var datestr2 = $('#datefield2-id').val();

Tôi thực sự khuyên bạn nên phân tích cú pháp các chuỗi ngày trước khi so sánh chúng. Đối tượng Date của Javascript có phương thức parse () -, nhưng nó chỉ hỗ trợ các định dạng ngày tháng của Hoa Kỳ (YYYY / MM / DD). Nó trả về mili giây kể từ đầu kỷ nguyên unix, vì vậy bạn có thể chỉ cần so sánh các giá trị của mình với> hoặc <.

Nếu bạn muốn các định dạng khác nhau (ví dụ: ISO 8661), bạn cần sử dụng các cụm từ thông dụng hoặc thư viện date.js miễn phí.

Nếu bạn muốn trở thành người dùng siêu giỏi, bạn có thể sử dụng bộ chọn ngày jquery ui thay vì trường văn bản. Có một biến thể công cụ chọn ngày cho phép nhập phạm vi ngày:

http://www.filamentgroup.com/lab/date_range_picker_using_jquery_ui_16_and_jquery_ui_css_framework/


5

Vì vậy, tôi cần quy tắc này là tùy chọn và không có đề xuất nào ở trên là tùy chọn. Nếu tôi gọi phương thức, nó đang hiển thị theo yêu cầu ngay cả khi tôi đặt nó thành giá trị.

Đây là cuộc gọi của tôi:

  $("#my_form").validate({
    rules: {
      "end_date": {
        required: function(element) {return ($("#end_date").val()!="");},
        greaterStart: "#start_date"
      }
    }
  });//validate()

addMethodCâu trả lời của tôi không mạnh mẽ như câu trả lời được xếp hạng cao nhất của Mike E., nhưng tôi đang sử dụng trình chọn ngày JqueryUI để buộc chọn ngày. Nếu ai đó có thể cho tôi biết cách đảm bảo ngày tháng là số và có phương thức là tùy chọn sẽ rất tuyệt, nhưng hiện tại phương pháp này phù hợp với tôi:

jQuery.validator.addMethod("greaterStart", function (value, element, params) {
    return this.optional(element) || new Date(value) >= new Date($(params).val());
},'Must be greater than start date.');

4

Trong javascript / jquery, hầu hết các nhà phát triển sử dụng so sánh Từ & Đến ngày là chuỗi, không chuyển đổi thành định dạng ngày. Cách đơn giản nhất để so sánh từ ngày lớn hơn với ngày là.

Date.parse(fromDate) > Date.parse(toDate)

Luôn phân tích cú pháp từ và đến ngày trước khi so sánh để có kết quả chính xác


Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào ; thay vào đó, cung cấp câu trả lời không yêu cầu người hỏi làm rõ . - Từ đánh giá
Mamun

Nó là giải pháp cho câu hỏi. Tôi đã thử và trả lời.
Kunal Brahme

2

Tôi thích những gì Franz nói, vì đó là những gì tôi đang sử dụng: P

var date_ini = new Date($('#id_date_ini').val()).getTime();
var date_end = new Date($('#id_date_end').val()).getTime();
if (isNaN(date_ini)) {
// error date_ini;
}
if (isNaN(date_end)) {
// error date_end;
}
if (date_ini > date_end) {
// do something;
}

2
$(document).ready(function(){
   $("#txtFromDate").datepicker({
        minDate: 0,
        maxDate: "+60D",
        numberOfMonths: 2,
        onSelect: function(selected) {
          $("#txtToDate").datepicker("option","minDate", selected)
        }
    });

    $("#txtToDate").datepicker({
        minDate: 0,
        maxDate:"+60D",
        numberOfMonths: 2,
        onSelect: function(selected) {
           $("#txtFromDate").datepicker("option","maxDate", selected)
        }
    });
});

Hoặc Truy cập vào liên kết này


2
jQuery('#from_date').on('change', function(){
    var date = $(this).val();
    jQuery('#to_date').datetimepicker({minDate: date});  
});

1
function endDate(){
    $.validator.addMethod("endDate", function(value, element) {
      var params = '.startDate';
        if($(element).parent().parent().find(params).val()!=''){
           if (!/Invalid|NaN/.test(new Date(value))) {
               return new Date(value) > new Date($(element).parent().parent().find(params).val());
            }
       return isNaN(value) && isNaN($(element).parent().parent().find(params).val()) || (parseFloat(value) > parseFloat($(element).parent().parent().find(params).val())) || value == "";              
      }else{
        return true;
      }
      },jQuery.format('must be greater than start date'));

}

function startDate(){
            $.validator.addMethod("startDate", function(value, element) {
            var params = '.endDate';
            if($(element).parent().parent().parent().find(params).val()!=''){
                 if (!/Invalid|NaN/.test(new Date(value))) {
                  return new Date(value) < new Date($(element).parent().parent().parent().find(params).val());
            }
           return isNaN(value) && isNaN($(element).parent().parent().find(params).val()) || (parseFloat(value) < parseFloat($(element).parent().parent().find(params).val())) || value == "";
                 }
                        else{
                     return true;
}

    }, jQuery.format('must be less than end date'));
}

Hy vọng điều này sẽ giúp :)


0

Đầu tiên, bạn tách các giá trị của hai hộp nhập bằng cách sử dụng chức năng tách. sau đó nối giống nhau theo thứ tự ngược lại. sau khi concat Nation phân tích cú pháp nó thành số nguyên. sau đó so sánh hai giá trị trong câu lệnh if. ví dụ: 1> 20-11-2018 2> 21-11-2018

sau khi tách và ghép các giá trị mới để so sánh 20181120 và 20181121 sau đó so sánh giống nhau.

var date1 = $('#datevalue1').val();
var date2 = $('#datevalue2').val();
var d1 = date1.split("-");
var d2 = date2.split("-");

d1 = d1[2].concat(d1[1], d1[0]);
d2 = d2[2].concat(d2[1], d2[0]);

if (parseInt(d1) > parseInt(d2)) {

    $('#fromdatepicker').val('');
} else {

}

Vui lòng thêm giải thích về giải pháp này
Jan Černý

0

cái này sẽ hoạt động

$.validator.addMethod("endDate", function(value, element) {
            var startDate = $('#date_open').val();
            return Date.parse(startDate) <= Date.parse(value) || value == "";
        }, "* End date must be after start date");


-2

Nếu định dạng được đảm bảo là đúng YYYY / MM / DD và hoàn toàn giống nhau giữa hai trường thì bạn có thể sử dụng:

if (startdate > enddate) {
   alert('error'
}

Như một so sánh chuỗi


làm cách nào để xác định ngày bắt đầu và ngày kết thúc trong jquery?
đầu vào

Tôi giả sử chúng là các chuỗi thông thường. Bạn đọc chúng như thế $ (# startdate: input) .val () và $ (# enddate: input) .val ()
Nadia Alramli
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.