Bagaimana cara memvalidasi tanggal dengan format “bb / hh / tttt” di JavaScript?


107

Saya ingin memvalidasi format tanggal pada input menggunakan format mm/dd/yyyy.

Saya menemukan kode di bawah ini di satu situs dan kemudian menggunakannya tetapi tidak berhasil:

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!'); 
    } 
}

Ada saran tentang apa yang mungkin salah?


3
Selamat datang di StackOverflow. Anda dapat memformat kode sumber dengan {}tombol toolbar. Saya telah melakukannya untuk Anda kali ini. Selain itu, coba berikan beberapa informasi tentang masalah Anda: deskripsi tidak berfungsi berguna sebagai solusi kemudian memperbaikinya .
Álvaro González

Jenis format tanggal apa yang Anda coba validasi? Dapatkah Anda memberikan beberapa contoh tanggal yang seharusnya valid?
Niklas


Jawaban:


188

Saya pikir Niklas memiliki jawaban yang tepat untuk masalah Anda. Selain itu, menurut saya fungsi validasi tanggal berikut ini sedikit lebih mudah dibaca:

// 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
Ingatlah untuk menggunakan argumen kedua untuk parseInt: parseInt(parts[0], 10). Jika tidak, bulan September 09dibaca sebagai oktal dan
diurai

1
Beberapa tahun kemudian dan ini hanya menghemat sedikit waktu saya, terima kasih atas jawaban yang manis!
PsychoMantis

1
Posting yang bagus! Menggabungkan pemformatan regex dengan penguraian yang diperlukan untuk validasi.
James Drinkard

4
Saya sarankan Anda mengubah ekspresi reguler menjadi: / ^ (\ d {2} | \ d {1}) \ / (\ d {2} | \ d {1}) \ / \ d {4} $ / ini cara menangkap satu digit bulan dan hari 1/5/2014. Terima kasih untuk sampelnya!
Mitch Labrador

1
Ini adalah jawaban yang paling ringkas, efisien dan elegan. Ini harus yang diterima
Zorgatone

122

Saya akan menggunakan Moment.js untuk validasi tanggal.

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

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

truenilai untuk kredit parsing ketat ke @Andrey Prokhorov yang artinya

Anda dapat menentukan boolean untuk argumen terakhir agar Momen menggunakan penguraian ketat. Penguraian yang ketat mengharuskan format dan masukan sama persis, termasuk pembatas.


23
+1 Saya benar-benar harus menjawab ini sebagai satu-satunya jawaban yang sangat benar di antara semua yang dikirimkan! Anda TIDAK ingin melakukan sesuatu yang serumit penguraian tanggal sendiri!
Theodore R. Smith

6
Gunakan "M / D / YYYY" untuk mengizinkan 1-2 digit untuk Bulan & Hari.
James di Indy

3
baik untuk mengetahui bahwa parameter ketiga "true" tetap untuk "use tight
Andrey Prokhorov

@Razan Paul harap Anda tidak keberatan saya menambahkan sedikit penjelasan untuk lebih jelasnya. bijaksana untuk tidak menemukan kembali roda lagi dan lagi, jadi jawaban pual adalah yang terbaik menurut pendapat saya
Kick Buttowski

1
momen (dateString, 'MM / DD / YYYY', true) .isValid () || momen (dateString, 'M / DD / YYYY', true) .isValid () || moment (dateString, 'MM / D / YYYY', true) .isValid ();
Yoav Schniederman

43

Gunakan ekspresi reguler berikut untuk memvalidasi:

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

Ini bekerja untuk saya untuk MM / dd / yyyy.


3
Bagaimana Kami akan memvalidasi tttt-bb-hh atau tanggal tidak valid seperti 9834-66-43
Sandeep Singh

7
Anda dapat menggunakan / ^ [0-9] {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [1-2] [0-9] | 3 [0-1]) $ / untuk memvalidasi yyyy-mm-dd.
Ravi Kant

2
ini luar biasa, karena saya untuk satu benci merumuskan regex dan dua menyukai efisiensi mereka!
jadrake

5
Apa yang terjadi di tahun 3000? :)
TheOne

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

29

Semua kredit pergi ke elian-ebbing

Hanya untuk yang malas di sini saya juga menyediakan versi fungsi yang disesuaikan untuk format 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];
}

Ini memvalidasi '2020-5-1' sebagai benar sementara nol di depannya diabaikan. Saya membuatnya bekerja dengan terlebih dahulu menguji pola tahun dengan /^(19|20)\d\d$/, bulan dengan /^(0[0-9]|1[0-2])$/dan hari dengan /^(0[1-9]|[12][0-9]|3[01])$/sebelum parsing. Kemudian itu berhasil, terima kasih.
Hmerman6006

Juga untuk menguji pola tanggal untuk format tttt-bb-hh, ekspresi reguler ini /^\d{4}\-\d{1,2}\-\d{1,2}$/akan memvalidasi tttt-bb-hh atau tttt sebagai benar, oleh karena itu hanya memvalidasi panjang bukan setiap bagian tanggal individual. Untuk panjang tttt-bb-hh tanpa memeriksa apakah tahun, bulan, dan tanggal sudah benar, gunakanlah /^\d{4}\-\d{2}\-\d{2}$/.
Hmerman6006

17

Anda bisa menggunakan Date.parse()

Anda dapat membaca di dokumentasi MDN

The Date.parse () metode mem-parsing representasi string dari tanggal, dan mengembalikan jumlah milidetik sejak 1 Januari 1970, 00:00:00 UTC atau NaN jika string tidak dikenali atau, dalam beberapa kasus, berisi nilai tanggal ilegal (mis. 2015-02-31).

Dan periksa apakah hasil dari 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

Silakan lihat kapan direkomendasikan untuk digunakan Date.parsedi MDN


1
Date.parse akan memberi Anda penguraian yang valid dengan tanggal seperti "46/7/17"
LarryBud

Akan mengembalikan hasil sebenarnya untuk yyyy /
02/30

11

Tampaknya berfungsi dengan baik untuk tanggal format bb / hh / tttt, contoh:

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

Satu-satunya masalah yang saya miliki dengan kode Anda adalah kenyataan bahwa:

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

Memiliki spasi di dalam tanda kurung, sebelum ID elemen. Mengubahnya menjadi:

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

Tanpa detail lebih lanjut tentang jenis data yang tidak berfungsi, tidak banyak lagi yang bisa diberikan masukan.


9

Fungsi akan mengembalikan nilai true jika string yang diberikan dalam format yang benar ('MM / DD / YYYY') jika tidak maka akan mengembalikan false. (Saya menemukan kode ini online & mengubahnya sedikit)

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

Berikut ini satu cuplikan untuk memeriksa tanggal valid:

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

Tidak apa-apa jika Anda ingin memeriksa validasi 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

Temukan di kode di bawah ini yang memungkinkan untuk melakukan validasi tanggal untuk salah satu format yang disediakan untuk memvalidasi tanggal mulai / dari dan akhir / hingga. Mungkin ada beberapa pendekatan yang lebih baik tetapi telah menghasilkan ini. Catatan format tanggal yang disediakan dan string tanggal berjalan seiring.

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

Di bawah ini adalah cuplikan 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();" />

Luar biasa. Inilah yang saya cari.
Turbo

1

Saya menarik sebagian besar kode ini dari posting lain yang ditemukan di sini . Saya telah memodifikasinya untuk tujuan saya. Ini bekerja dengan baik untuk apa yang saya butuhkan. Ini dapat membantu situasi Anda.

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

Mirip dengan jawaban Elian Ebbing, tapi mendukung "\", "/", ".", "-", "" delimiters

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

hari dan bulanmu mundur.
BoundForGlory

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
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang.
thewaywewere

1

Momen benar-benar bagus untuk menyelesaikannya. Saya tidak melihat alasan untuk menambah kerumitan hanya untuk memeriksa tanggal ... lihat saat ini: http://momentjs.com/

HTML:

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

Script:

 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

Tanggal string pertama diubah ke format tanggal js dan diubah menjadi format string lagi, kemudian dibandingkan dengan string asli.

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

kita dapat menggunakan fungsi atau pola tanggal yang disesuaikan. Kode di bawah ini adalah fungsi yang disesuaikan sesuai kebutuhan Anda, silakan ubah.

 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

Sangat tidak biasa melihat postingan yang begitu lama dengan topik dasar seperti itu, dengan begitu banyak jawaban, tidak ada yang benar. (Saya tidak mengatakan tidak ada yang berhasil.)

  • Rutinitas penentuan tahun kabisat tidak diperlukan untuk ini. Bahasa dapat melakukannya untuk kita.
  • Momen tidak diperlukan untuk ini.
  • Date.parse()tidak boleh digunakan untuk string tanggal lokal. MDN mengatakan "Tidak disarankan untuk menggunakan Date.parse karena hingga ES5, penguraian string sepenuhnya bergantung pada implementasi." Standar membutuhkan string ISO 8601 (berpotensi disederhanakan); dukungan untuk format lain bergantung pada implementasi.
  • Juga tidak boleh new Date(string)digunakan, karena itu menggunakan Date.parse ().
  • IMO hari kabisat harus divalidasi.
  • Fungsi validasi harus memperhitungkan kemungkinan bahwa string input tidak cocok dengan format yang diharapkan. Misalnya, '1a / 2a / 3aaa', '1234567890', atau 'ab / cd / efgh'.

Berikut adalah solusi yang efisien dan ringkas tanpa konversi implisit. Ini memanfaatkan kesediaan konstruktor Tanggal untuk menafsirkan 2018-14-29 sebagai 2019-03-01. Itu memang menggunakan beberapa fitur bahasa modern, tetapi itu mudah dihapus jika diperlukan. Saya juga menyertakan beberapa tes.

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

mengembalikan nilai true untuk string tanggal yang valid.


-3
var date = new Date(date_string)

mengembalikan literal 'Invalid Date'untuk string_tanggal yang tidak valid.

Catatan: Silakan lihat komentar di bawah.


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


Untuk menguraikan lebih lanjut tentang kasus penggunaan yang tidak berfungsi, harap baca catatan pertama dari dokumentasi parameter Tanggal Mozilla .
falsarella

1
Ya, saya membiarkan ini terutama untuk menunjukkan bahwa mereka adalah alternatif untuk menulis parsing ad-hoc. Tautan di atas berwibawa. Dok yang bagus!
samis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.