Làm cách nào để xác thực ngày với định dạng “mm / dd / yyyy” trong JavaScript?


106

Tôi muốn xác thực định dạng ngày trên một đầu vào bằng cách sử dụng định dạng mm/dd/yyyy.

Tôi đã tìm thấy các mã dưới đây trong một trang web và sau đó sử dụng nó nhưng nó không hoạt động:

function isDate(ExpiryDate) { 
    var objDate,  // date object initialized from the ExpiryDate string 
        mSeconds, // ExpiryDate in milliseconds 
        day,      // day 
        month,    // month 
        year;     // year 
    // date length should be 10 characters (no more no less) 
    if (ExpiryDate.length !== 10) { 
        return false; 
    } 
    // third and sixth character should be '/' 
    if (ExpiryDate.substring(2, 3) !== '/' || ExpiryDate.substring(5, 6) !== '/') { 
        return false; 
    } 
    // extract month, day and year from the ExpiryDate (expected format is mm/dd/yyyy) 
    // subtraction will cast variables to integer implicitly (needed 
    // for !== comparing) 
    month = ExpiryDate.substring(0, 2) - 1; // because months in JS start from 0 
    day = ExpiryDate.substring(3, 5) - 0; 
    year = ExpiryDate.substring(6, 10) - 0; 
    // test year range 
    if (year < 1000 || year > 3000) { 
        return false; 
    } 
    // convert ExpiryDate to milliseconds 
    mSeconds = (new Date(year, month, day)).getTime(); 
    // initialize Date() object from calculated milliseconds 
    objDate = new Date(); 
    objDate.setTime(mSeconds); 
    // compare input date and parts from Date() object 
    // if difference exists then date isn't valid 
    if (objDate.getFullYear() !== year || 
        objDate.getMonth() !== month || 
        objDate.getDate() !== day) { 
        return false; 
    } 
    // otherwise return true 
    return true; 
}

function checkDate(){ 
    // define date string to test 
    var ExpiryDate = document.getElementById(' ExpiryDate').value; 
    // check date and print message 
    if (isDate(ExpiryDate)) { 
        alert('OK'); 
    } 
    else { 
        alert('Invalid date format!'); 
    } 
}

Bất kỳ đề nghị về những gì có thể là sai?


3
Chào mừng bạn đến với StackOverflow. Bạn có thể định dạng mã nguồn bằng {}nút trên thanh công cụ. Tôi đã làm điều đó cho bạn lần này. Ngoài ra, hãy cố gắng cung cấp một số thông tin về sự cố của bạn: một mô tả không hoạt động là một giải pháp hữu ích như một giải pháp sau đó khắc phục sự cố .
Álvaro González

Bạn đang cố gắng xác thực loại định dạng ngày nào? Bạn có thể đưa ra một số ví dụ về các ngày nên có giá trị không?
Niklas


Câu trả lời:


187

Tôi nghĩ Niklas có câu trả lời phù hợp cho vấn đề của bạn. Bên cạnh đó, tôi nghĩ rằng hàm xác thực ngày tháng sau đây dễ đọc hơn một chút:

// Validates that the input string is a valid date formatted as "mm/dd/yyyy"
function isValidDate(dateString)
{
    // First check for the pattern
    if(!/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(dateString))
        return false;

    // Parse the date parts to integers
    var parts = dateString.split("/");
    var day = parseInt(parts[1], 10);
    var month = parseInt(parts[0], 10);
    var year = parseInt(parts[2], 10);

    // Check the ranges of month and year
    if(year < 1000 || year > 3000 || month == 0 || month > 12)
        return false;

    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

    // Adjust for leap years
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        monthLength[1] = 29;

    // Check the range of the day
    return day > 0 && day <= monthLength[month - 1];
};

9
Hãy nhớ sử dụng đối số thứ hai để parseInt: parseInt(parts[0], 10). Nếu không, tháng 9 09được đọc là bát phân và phân tích cú pháp thành 0
ômomg vào

1
Một vài năm sau và điều này chỉ tiết kiệm cho tôi một chút thời gian, cảm ơn vì câu trả lời ngọt ngào!
PsychoMantis

1
Bài xuất sắc! Kết hợp định dạng regex với phân tích cú pháp cần thiết để xác thực.
James Drinkard

4
Tôi khuyên bạn nên thay đổi regex thành này: / ^ (\ d {2} | \ d {1}) \ / (\ d {2} | \ d {1}) \ / \ d {4} $ / this cách nó bắt được một chữ số tháng và ngày 1/5/2014. Cảm ơn vì mẫu!
Mitch Labrador

1
Đây là câu trả lời nhỏ gọn, hiệu quả và thanh lịch nhất. Đây phải là cái được chấp nhận
Zorgatone

121

Tôi sẽ sử dụng Moment.js để xác thực ngày.

alert(moment("05/22/2012", 'MM/DD/YYYY',true).isValid()); //true

Jsfiddle: http://jsfiddle.net/q8y9nbu5/

truegiá trị dành cho tín dụng phân tích cú pháp chặt chẽ cho @Andrey Prokhorov, nghĩa là

bạn có thể chỉ định boolean cho đối số cuối cùng để khiến Moment sử dụng phân tích cú pháp nghiêm ngặt. Việc phân tích cú pháp nghiêm ngặt yêu cầu định dạng và đầu vào phải khớp chính xác, bao gồm cả dấu phân cách.


22
+1 Tôi hoàn toàn phải thứ hai đây là câu trả lời cực kỳ chính xác duy nhất trong số tất cả những người đã gửi! Bạn KHÔNG muốn tự mình làm điều gì đó phức tạp như phân tích cú pháp ngày tháng!
Theodore R. Smith

5
Sử dụng "M / D / YYYY" để cho phép 1-2 chữ số cho Tháng & Ngày.
James in Indy

3
thật tốt khi biết rằng thông số thứ ba "true" vẫn ở chế độ "sử dụng phân tích cú pháp nghiêm ngặt" momentjs.com/docs/#/parsing/string-format
Andrey Prokhorov

@Razan Paul hy vọng bạn không phiền, tôi đã thêm một chút giải thích để rõ ràng hơn. Thật khôn ngoan khi không phát minh lại các bánh xe nhiều lần, vì vậy câu trả lời của pual là câu trả lời tốt nhất theo ý kiến ​​khiêm tốn của tôi
Kick Buttowski

thời điểm (dateString, 'MM / DD / YYYY', true) .isValid () || thời điểm (dateString, 'M / DD / YYYY', true) .isValid () || moment (dateString, 'MM / D / YYYY', true) .isValid ();
Yoav Schniederman

43

Sử dụng biểu thức chính quy sau để xác thực:

var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/;
if (!(date_regex.test(testDate))) {
    return false;
}

Điều này đang làm việc cho tôi cho MM / dd / yyyy.


3
Làm thế nào Chúng tôi sẽ xác nhận yyyy-mm-dd hoặc ngày không hợp lệ như 9834-66-43
Sandeep Singh

7
Bạn có thể sử dụng / ^ [0-9] {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [1-2] [0-9] | 3 [0-1]) $ / để xác thực yyyy-mm-dd.
Ravi Kant,

2
điều này thật tuyệt vời, vì tôi ghét công thức regex và hai thích hiệu quả của chúng!
jadrake

5
Điều gì xảy ra vào năm 3000? :)
TheOne

4
@ TheOne..y3k problem ..: P
Sathesh

29

Tất cả các khoản tín dụng được chuyển đến elian-ebbing

Chỉ dành cho những người lười biếng ở đây, tôi cũng cung cấp phiên bản tùy chỉnh của hàm cho định dạng yyyy-mm-dd .

function isValidDate(dateString)
{
    // First check for the pattern
    var regex_date = /^\d{4}\-\d{1,2}\-\d{1,2}$/;

    if(!regex_date.test(dateString))
    {
        return false;
    }

    // Parse the date parts to integers
    var parts   = dateString.split("-");
    var day     = parseInt(parts[2], 10);
    var month   = parseInt(parts[1], 10);
    var year    = parseInt(parts[0], 10);

    // Check the ranges of month and year
    if(year < 1000 || year > 3000 || month == 0 || month > 12)
    {
        return false;
    }

    var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

    // Adjust for leap years
    if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
    {
        monthLength[1] = 29;
    }

    // Check the range of the day
    return day > 0 && day <= monthLength[month - 1];
}

Điều này xác nhận '2020-5-1' là đúng trong khi các số 0 đứng đầu bị bỏ qua. Tôi đã làm cho nó hoạt động bằng cách thử nghiệm đầu tiên mẫu của năm với /^(19|20)\d\d$/, tháng với /^(0[0-9]|1[0-2])$/và ngày với /^(0[1-9]|[12][0-9]|3[01])$/trước khi phân tích cú pháp. Sau đó, nó đã làm việc cảm ơn.
Hmerman6006

Ngoài ra, để kiểm tra mẫu ngày cho định dạng yyyy-mm-dd chính xác, regex /^\d{4}\-\d{1,2}\-\d{1,2}$/này sẽ xác thực yyyy-mm-dd hoặc yyyy-md là đúng, do đó nó chỉ xác thực độ dài chứ không phải từng phần ngày riêng lẻ. Để có độ dài chính xác của yyyy-mm-dd mà không cần kiểm tra xem năm, tháng và ngày có được sử dụng chính xác hay /^\d{4}\-\d{2}\-\d{2}$/không.
Hmerman6006

17

Bạn đã có thể sử dụng Date.parse()

Bạn có thể đọc trong tài liệu MDN

Phương thức Date.parse () phân tích cú pháp biểu diễn chuỗi của một ngày và trả về số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00:00 UTC hoặc NaN nếu chuỗi không được nhận dạng hoặc trong một số trường hợp, chứa các giá trị ngày không hợp lệ (ví dụ: 2015-02-31).

Và kiểm tra xem kết quả của Date.parseisNaN

let isValidDate = Date.parse('01/29/1980');

if (isNaN(isValidDate)) {
  // when is not valid date logic

  return false;
}

// when is valid date logic

Vui lòng xem khi nào được khuyến nghị sử dụng Date.parsetrong MDN


1
Date.parse sẽ cung cấp cho bạn một phân tích cú pháp hợp lệ với ngày chẳng hạn như "46/7/17"
LarryBud

Sẽ trả về kết quả true cho yyyy /
02/30

11

Có vẻ như nó hoạt động tốt cho các ngày định dạng mm / dd / yyyy, ví dụ:

http://jsfiddle.net/niklasvh/xfrLm/

Vấn đề duy nhất tôi gặp phải với mã của bạn là thực tế:

var ExpiryDate = document.getElementById(' ExpiryDate').value;

Có khoảng trắng bên trong dấu ngoặc, trước ID phần tử. Đã thay đổi nó thành:

var ExpiryDate = document.getElementById('ExpiryDate').value;

Nếu không có bất kỳ chi tiết nào khác về loại dữ liệu không hoạt động, không có nhiều thứ khác để cung cấp đầu vào.


9

Hàm sẽ trả về true nếu chuỗi đã cho ở đúng định dạng ('MM / DD / YYYY'), nếu không, nó sẽ trả về false. (Tôi tìm thấy mã này trực tuyến và đã sửa đổi nó một chút)

function isValidDate(date) {
    var temp = date.split('/');
    var d = new Date(temp[2] + '/' + temp[0] + '/' + temp[1]);
    return (d && (d.getMonth() + 1) == temp[0] && d.getDate() == Number(temp[1]) && d.getFullYear() == Number(temp[2]));
}

console.log(isValidDate('02/28/2015'));
            


4

Đây là một đoạn mã để kiểm tra ngày hợp lệ:

function validateDate(dateStr) {
   const regExp = /^(\d\d?)\/(\d\d?)\/(\d{4})$/;
   let matches = dateStr.match(regExp);
   let isValid = matches;
   let maxDate = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
   
   if (matches) {
     const month = parseInt(matches[1]);
     const date = parseInt(matches[2]);
     const year = parseInt(matches[3]);
     
     isValid = month <= 12 && month > 0;
     isValid &= date <= maxDate[month] && date > 0;
     
     const leapYear = (year % 400 == 0)
        || (year % 4 == 0 && year % 100 != 0);
     isValid &= month != 2 || leapYear || date <= 28; 
   }
   
   return isValid
}

console.log(['1/1/2017', '01/1/2017', '1/01/2017', '01/01/2017', '13/12/2017', '13/13/2017', '12/35/2017'].map(validateDate));


3

Sẽ ổn nếu bạn muốn kiểm tra xác thực dd / MM / yyyy

function isValidDate(date) {
    var temp = date.split('/');
    var d = new Date(temp[1] + '/' + temp[0] + '/' + temp[2]);
     return (d && (d.getMonth() + 1) == temp[1] && d.getDate() == Number(temp[0]) && d.getFullYear() == Number(temp[2]));
}

alert(isValidDate('29/02/2015')); // it not exist ---> false
            


2

Tìm trong đoạn mã dưới đây cho phép thực hiện xác thực ngày cho bất kỳ định dạng nào được cung cấp để xác thực ngày bắt đầu / từ và kết thúc / đến. Có thể có một số cách tiếp cận tốt hơn nhưng đã nghĩ ra điều này. Lưu ý định dạng ngày được cung cấp và chuỗi ngày đi đôi với nhau.

<script type="text/javascript">
    function validate() {

        var format = 'yyyy-MM-dd';

        if(isAfterCurrentDate(document.getElementById('start').value, format)) {
            alert('Date is after the current date.');
        } else {
            alert('Date is not after the current date.');
        }
        if(isBeforeCurrentDate(document.getElementById('start').value, format)) {
            alert('Date is before current date.');
        } else {
            alert('Date is not before current date.');
        }
        if(isCurrentDate(document.getElementById('start').value, format)) {
            alert('Date is current date.');
        } else {
            alert('Date is not a current date.');
        }
        if (isBefore(document.getElementById('start').value, document.getElementById('end').value, format)) {
            alert('Start/Effective Date cannot be greater than End/Expiration Date');
        } else {
            alert('Valid dates...');
        }
        if (isAfter(document.getElementById('start').value, document.getElementById('end').value, format)) {
            alert('End/Expiration Date cannot be less than Start/Effective Date');
        } else {
            alert('Valid dates...');
        }
        if (isEquals(document.getElementById('start').value, document.getElementById('end').value, format)) {
            alert('Dates are equals...');
        } else {
            alert('Dates are not equals...');
        }
        if (isDate(document.getElementById('start').value, format)) {
            alert('Is valid date...');
        } else {
            alert('Is invalid date...');
        }
    }

    /**
     * This method gets the year index from the supplied format
     */
    function getYearIndex(format) {

        var tokens = splitDateFormat(format);

        if (tokens[0] === 'YYYY'
                || tokens[0] === 'yyyy') {
            return 0;
        } else if (tokens[1]=== 'YYYY'
                || tokens[1] === 'yyyy') {
            return 1;
        } else if (tokens[2] === 'YYYY'
                || tokens[2] === 'yyyy') {
            return 2;
        }
        // Returning the default value as -1
        return -1;
    }

    /**
     * This method returns the year string located at the supplied index
     */
    function getYear(date, index) {

        var tokens = splitDateFormat(date);
        return tokens[index];
    }

    /**
     * This method gets the month index from the supplied format
     */
    function getMonthIndex(format) {

        var tokens = splitDateFormat(format);

        if (tokens[0] === 'MM'
                || tokens[0] === 'mm') {
            return 0;
        } else if (tokens[1] === 'MM'
                || tokens[1] === 'mm') {
            return 1;
        } else if (tokens[2] === 'MM'
                || tokens[2] === 'mm') {
            return 2;
        }
        // Returning the default value as -1
        return -1;
    }

    /**
     * This method returns the month string located at the supplied index
     */
    function getMonth(date, index) {

        var tokens = splitDateFormat(date);
        return tokens[index];
    }

    /**
     * This method gets the date index from the supplied format
     */
    function getDateIndex(format) {

        var tokens = splitDateFormat(format);

        if (tokens[0] === 'DD'
                || tokens[0] === 'dd') {
            return 0;
        } else if (tokens[1] === 'DD'
                || tokens[1] === 'dd') {
            return 1;
        } else if (tokens[2] === 'DD'
                || tokens[2] === 'dd') {
            return 2;
        }
        // Returning the default value as -1
        return -1;
    }

    /**
     * This method returns the date string located at the supplied index
     */
    function getDate(date, index) {

        var tokens = splitDateFormat(date);
        return tokens[index];
    }

    /**
     * This method returns true if date1 is before date2 else return false
     */
    function isBefore(date1, date2, format) {
        // Validating if date1 date is greater than the date2 date
        if (new Date(getYear(date1, getYearIndex(format)), 
                getMonth(date1, getMonthIndex(format)) - 1, 
                getDate(date1, getDateIndex(format))).getTime()
            > new Date(getYear(date2, getYearIndex(format)), 
                getMonth(date2, getMonthIndex(format)) - 1, 
                getDate(date2, getDateIndex(format))).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method returns true if date1 is after date2 else return false
     */
    function isAfter(date1, date2, format) {
        // Validating if date2 date is less than the date1 date
        if (new Date(getYear(date2, getYearIndex(format)), 
                getMonth(date2, getMonthIndex(format)) - 1, 
                getDate(date2, getDateIndex(format))).getTime()
            < new Date(getYear(date1, getYearIndex(format)), 
                getMonth(date1, getMonthIndex(format)) - 1, 
                getDate(date1, getDateIndex(format))).getTime()
            ) {
            return true;
        } 
        return false;                
    }

    /**
     * This method returns true if date1 is equals to date2 else return false
     */
    function isEquals(date1, date2, format) {
        // Validating if date1 date is equals to the date2 date
        if (new Date(getYear(date1, getYearIndex(format)), 
                getMonth(date1, getMonthIndex(format)) - 1, 
                getDate(date1, getDateIndex(format))).getTime()
            === new Date(getYear(date2, getYearIndex(format)), 
                getMonth(date2, getMonthIndex(format)) - 1, 
                getDate(date2, getDateIndex(format))).getTime()) {
            return true;
        } 
        return false;
    }

    /**
     * This method validates and returns true if the supplied date is 
     * equals to the current date.
     */
    function isCurrentDate(date, format) {
        // Validating if the supplied date is the current date
        if (new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))).getTime()
            === new Date(new Date().getFullYear(), 
                    new Date().getMonth(), 
                    new Date().getDate()).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method validates and returns true if the supplied date value 
     * is before the current date.
     */
    function isBeforeCurrentDate(date, format) {
        // Validating if the supplied date is before the current date
        if (new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))).getTime()
            < new Date(new Date().getFullYear(), 
                    new Date().getMonth(), 
                    new Date().getDate()).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method validates and returns true if the supplied date value 
     * is after the current date.
     */
    function isAfterCurrentDate(date, format) {
        // Validating if the supplied date is before the current date
        if (new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))).getTime()
            > new Date(new Date().getFullYear(),
                    new Date().getMonth(), 
                    new Date().getDate()).getTime()) {
            return true;
        } 
        return false;                
    }

    /**
     * This method splits the supplied date OR format based 
     * on non alpha numeric characters in the supplied string.
     */
    function splitDateFormat(dateFormat) {
        // Spliting the supplied string based on non characters
        return dateFormat.split(/\W/);
    }

    /*
     * This method validates if the supplied value is a valid date.
     */
    function isDate(date, format) {                
        // Validating if the supplied date string is valid and not a NaN (Not a Number)
        if (!isNaN(new Date(getYear(date, getYearIndex(format)), 
                getMonth(date, getMonthIndex(format)) - 1, 
                getDate(date, getDateIndex(format))))) {                    
            return true;
        } 
        return false;                                      
    }
</script>

Dưới đây là đoạn mã HTML

<input type="text" name="start" id="start" size="10" value="" />
<br/>
<input type="text" name="end" id="end" size="10" value="" />
<br/>
<input type="button" value="Submit" onclick="javascript:validate();" />

Thông minh. Đây là những gì tôi đang tìm kiếm.
Turbo

1

Tôi đã lấy hầu hết mã này từ một bài đăng khác được tìm thấy ở đây . Tôi đã sửa đổi nó cho các mục đích của tôi. Điều này hoạt động tốt cho những gì tôi cần. Nó có thể giúp ích cho tình huống của bạn.

$(window).load(function() {
  function checkDate() {
    var dateFormat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
    var valDate = $(this).val();
    if ( valDate.match( dateFormat )) {
      $(this).css("border","1px solid #cccccc","color", "#555555", "font-weight", "normal");
      var seperator1 = valDate.split('/');
      var seperator2 = valDate.split('-');

      if ( seperator1.length > 1 ) {
        var splitdate = valDate.split('/');
      } else if ( seperator2.length > 1 ) {
        var splitdate = valDate.split('-');
      }

      var dd = parseInt(splitdate[0]);
      var mm = parseInt(splitdate[1]);
      var yy = parseInt(splitdate[2]);
      var ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31];

      if ( mm == 1 || mm > 2 ) {
        if ( dd > ListofDays[mm - 1] ) {
          $(this).val("");
          $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
          alert('Invalid Date! You used a date which does not exist in the known calender.');
          return false;
        }
      }

      if ( mm == 2 ) {
       var lyear = false;
        if ( (!(yy % 4) && yy % 100) || !(yy % 400) ){
          lyear = true;
        }

        if ( (lyear==false) && (dd>=29) ) {
          $(this).val("");
          $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
          alert('Invalid Date! You used Feb 29th for an invalid leap year');
          return false;
        }

        if ( (lyear==true) && (dd>29) ) {
          $(this).val("");
          $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
          alert('Invalid Date! You used a date greater than Feb 29th in a valid leap year');
          return false;
        }
     }
    } else {
      $(this).val("");
      $(this).css("border","solid red 1px","color", "red", "font-weight", "bold");
      alert('Date format was invalid! Please use format mm/dd/yyyy');
      return false;
    }
  };

  $('#from_date').change( checkDate );
  $('#to_date').change( checkDate );
});

1

Tương tự như câu trả lời Elian Ebbing, nhưng hỗ trợ dấu phân cách "\", "/", ".", "-", ""

function js_validate_date_dmyyyy(js_datestr)
{
    var js_days_in_year = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
    var js_datepattern = /^(\d{1,2})([\.\-\/\\ ])(\d{1,2})([\.\-\/\\ ])(\d{4})$/;

    if (! js_datepattern.test(js_datestr)) { return false; }

    var js_match = js_datestr.match(js_datepattern);
    var js_day = parseInt(js_match[1]);
    var js_delimiter1 = js_match[2];
    var js_month = parseInt(js_match[3]);
    var js_delimiter2 = js_match[4];
    var js_year = parseInt(js_match[5]);                            

    if (js_is_leap_year(js_year)) { js_days_in_year[2] = 29; }

    if (js_delimiter1 !== js_delimiter2) { return false; } 
    if (js_month === 0  ||  js_month > 12)  { return false; } 
    if (js_day === 0  ||  js_day > js_days_in_year[js_month])   { return false; } 

    return true;
}

function js_is_leap_year(js_year)
{ 
    if(js_year % 4 === 0)
    { 
        if(js_year % 100 === 0)
        { 
            if(js_year % 400 === 0)
            { 
                return true; 
            } 
            else return false; 
        } 
        else return true; 
    } 
    return false; 
}

ngày và tháng của bạn bị lùi lại.
BoundForGlory, 27/09/17

1
function fdate_validate(vi)
{
  var parts =vi.split('/');
  var result;
  var mydate = new Date(parts[2],parts[1]-1,parts[0]);
  if (parts[2] == mydate.getYear() && parts[1]-1 == mydate.getMonth() && parts[0] == mydate.getDate() )
  {result=0;}
  else
  {result=1;}
  return(result);
}

3
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh về cách và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
thewaywewere

1

Moment thực sự là một trong những tốt để giải quyết nó. Tôi không thấy lý do để thêm phức tạp chỉ để kiểm tra ngày ... hãy xem ngay: http://momentjs.com/

HTML:

<input class="form-control" id="date" name="date" onchange="isValidDate(this);" placeholder="DD/MM/YYYY" type="text" value="">

Kịch bản :

 function isValidDate(dateString)  {
    var dateToValidate = dateString.value
    var isValid = moment(dateToValidate, 'MM/DD/YYYY',true).isValid()
    if (isValid) {
        dateString.style.backgroundColor = '#FFFFFF';
    } else {
        dateString.style.backgroundColor = '#fba';
    }   
};

0

Chuỗi ngày đầu tiên được chuyển đổi sang định dạng ngày js và chuyển đổi lại thành định dạng chuỗi, sau đó nó được so sánh với chuỗi ban đầu.

function dateValidation(){
    var dateString = "34/05/2019"
    var dateParts = dateString.split("/");
    var date= new Date(+dateParts[2], dateParts[1] - 1, +dateParts[0]);

    var isValid = isValid( dateString, date );
    console.log("Is valid date: " + isValid);
}

function isValidDate(dateString, date) {
    var newDateString = ( date.getDate()<10 ? ('0'+date.getDate()) : date.getDate() )+ '/'+ ((date.getMonth() + 1)<10? ('0'+(date.getMonth() + 1)) : (date.getMonth() + 1) )  + '/' +  date.getFullYear();
    return ( dateString == newDateString);
}

0

chúng ta có thể sử dụng chức năng tùy chỉnh hoặc mẫu ngày. Mã bên dưới là chức năng tùy chỉnh theo yêu cầu của bạn, vui lòng thay đổi nó.

 function isValidDate(str) {
        var getvalue = str.split('-');
        var day = getvalue[2];
        var month = getvalue[1];
        var year = getvalue[0];
        if(year < 1901 && year > 2100){
        return false;
        }
        if (month < 1 && month > 12) { 
          return false;
         }
         if (day < 1 && day > 31) {
          return false;
         }
         if ((month==4 && month==6 && month==9 && month==11) && day==31) {
          return false;
         }
         if (month == 2) { // check for february 29th
          var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
          if (day>29 || (day==29 && !isleap)) {
           return false;
         }
         }
         else{
         return true;

         }
        }

0

Thật bất thường khi thấy một bài đăng quá cũ về một chủ đề cơ bản như vậy, với rất nhiều câu trả lời, không câu trả lời nào đúng. (Tôi không nói rằng không ai trong số họ hoạt động.)

  • Việc xác định năm nhuận là không cần thiết. Ngôn ngữ có thể làm việc đó cho chúng ta.
  • Moment là không cần thiết cho việc này.
  • Date.parse()không nên được sử dụng cho chuỗi ngày cục bộ. MDN nói rằng "Không nên sử dụng Date.parse vì cho đến ES5, việc phân tích cú pháp các chuỗi hoàn toàn phụ thuộc vào việc triển khai." Tiêu chuẩn yêu cầu một chuỗi ISO 8601 (có thể được đơn giản hóa); hỗ trợ cho bất kỳ định dạng nào khác phụ thuộc vào việc triển khai.
  • Cũng không nên new Date(string) sử dụng, vì điều đó sử dụng Date.parse ().
  • IMO ngày nhuận cần được xác nhận.
  • Hàm xác nhận phải tính đến khả năng chuỗi đầu vào không khớp với định dạng mong đợi. Ví dụ: '1a / 2a / 3aaa', '1234567890' hoặc 'ab / cd / efgh'.

Đây là một giải pháp hiệu quả, ngắn gọn không có chuyển đổi ngầm. Nó tận dụng lợi thế của sự sẵn sàng của trình tạo Ngày để diễn giải 2018-14-29 là 2019-03-01. Nó sử dụng một vài tính năng ngôn ngữ hiện đại, nhưng chúng dễ dàng bị xóa nếu cần. Tôi cũng đã bao gồm một số bài kiểm tra.

function isValidDate(s) {
    // Assumes s is "mm/dd/yyyy"
    if ( ! /^\d\d\/\d\d\/\d\d\d\d$/.test(s) ) {
        return false;
    }
    const parts = s.split('/').map((p) => parseInt(p, 10));
    parts[0] -= 1;
    const d = new Date(parts[2], parts[0], parts[1]);
    return d.getMonth() === parts[0] && d.getDate() === parts[1] && d.getFullYear() === parts[2];
}

function testValidDate(s) {
    console.log(s, isValidDate(s));
}
testValidDate('01/01/2020'); // true
testValidDate('02/29/2020'); // true
testValidDate('02/29/2000'); // true
testValidDate('02/29/1900'); // false
testValidDate('02/29/2019'); // false
testValidDate('01/32/1970'); // false
testValidDate('13/01/1970'); // false
testValidDate('14/29/2018'); // false
testValidDate('1a/2b/3ccc'); // false
testValidDate('1234567890'); // false
testValidDate('aa/bb/cccc'); // false
testValidDate(null);         // false
testValidDate('');           // false

-1
  1. Javascript

    function validateDate(date) {
        try {
            new Date(date).toISOString();
            return true;
        } catch (e) { 
            return false; 
        }
    }
  2. JQuery

    $.fn.validateDate = function() {
        try {
            new Date($(this[0]).val()).toISOString();
            return true;
        } catch (e) { 
            return false; 
        }
    }

trả về true cho một chuỗi ngày hợp lệ.


-3
var date = new Date(date_string)

trả về ký tự 'Invalid Date'cho bất kỳ chuỗi ngày tháng không hợp lệ nào.

Lưu ý: Vui lòng xem phần bình luận bên dưới.


Sai: new Date("02-31-2000")cho Thu Mar 02 2000 00:00:00 GMT-0300 (BRT).
falsarella


Để giải thích thêm về trường hợp sử dụng mà nó không hoạt động, vui lòng đọc ghi chú đầu tiên từ tài liệu tham số Ngày của Mozilla .
falsarella

1
Vâng, tôi chủ yếu để lại điều này để chứng tỏ rằng chúng là những lựa chọn thay thế cho việc viết các phân đoạn đặc biệt. Liên kết trên là có thẩm quyền. Doc tốt mặc dù!
samis
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.