JavaScript'te "aa / gg / yyyy" biçiminde tarih nasıl doğrulanır?


107

Formatı kullanarak bir girişteki tarih formatını doğrulamak istiyorum mm/dd/yyyy.

Aşağıdaki kodları bir sitede buldum ve sonra kullandım ama işe yaramıyor:

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

Neyin yanlış olabileceği konusunda herhangi bir öneriniz var mı?


3
StackOverflow'a hoş geldiniz. Araç {}çubuğu düğmesiyle kaynak kodunu biçimlendirebilirsiniz . Bu sefer senin için yaptım. Ayrıca, sorununuz hakkında bazı bilgiler sağlamaya çalışın: Çalışmıyor açıklaması, bir sonra düzeltin çözümü olarak yararlıdır .
Álvaro González

Ne tür tarih biçimlerini doğrulamaya çalışıyorsunuz? Geçerli olması gereken tarihlere birkaç örnek verebilir misiniz?
Niklas


Yanıtlar:


188

Bence Niklas'ın sorununuz için doğru cevabı var. Bunun yanı sıra, aşağıdaki tarih doğrulama işlevinin okunması biraz daha kolay olduğunu düşünüyorum:

// 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
ParseInt ikinci argümanı kullanmayı unutmayın: parseInt(parts[0], 10). Aksi takdirde, Eylül ayları 09sekizlik olarak okunur ve 0 olarak ayrıştırılır
hugomg

1
Çizginin aşağısında birkaç yıl geçti ve bu bana biraz zaman kazandırdı, tatlı cevabın için teşekkürler!
PsychoMantis

1
Mükemmel gönderi! Doğrulama için normal ifade biçimlendirmesini gerekli ayrıştırmayla birleştirir.
James Drinkard

4
Normal ifadeyi şu şekilde değiştirmenizi öneririm: / ^ (\ d {2} | \ d {1}) \ / (\ d {2} | \ d {1}) \ / \ d {4} $ / this 1/5/2014 tarihinde bir basamaklı ayı ve günü yakalar. Örnek için teşekkürler!
Mitch Labrador

1
Bu en kompakt, verimli ve zarif cevaptır. Bu, kabul edilen olmalıdır
Zorgatone

122

Tarih doğrulaması için Moment.js kullanırdım .

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

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

truedeğer, @Andrey Prokhorov'a kesin ayrıştırma kredisi içindir;

Moment'in katı ayrıştırmayı kullanmasını sağlamak için son bağımsız değişken için bir boole belirtebilirsiniz. Katı ayrıştırma, sınırlayıcılar dahil olmak üzere biçim ve girişin tam olarak eşleşmesini gerektirir.


23
+1 Gönderilenler arasında son derece doğru tek cevap olarak bunu kesinlikle ikinci kez görmeliyim! Kendi başınıza tarih ayrıştırma gibi karmaşık bir şey yapmak İSTEMEZSİNİZ!
Theodore R. Smith

6
Ay ve Gün için 1-2 haneye izin vermek için "A / G / YYYY" kullanın.
James in Indy

3
üçüncü parametrenin "true" nun
Andrey Prokhorov

@Razan Paul umarım daha fazla netlik için küçük bir açıklama ekledim. tekerlekleri tekrar tekrar icat etmemek akıllıca, bu yüzden pual'ın cevabı benim mütevazı görüşüme göre en iyisi
Kick Buttowski

1
moment (dateString, 'AA / GG / YYYY', doğru) .isValid () || moment (dateString, 'A / GG / YYYY', doğru) .isValid () || moment (tarihDizesi, 'AA / G / YYYY', doğru) .isValid ();
Yoav Schniederman

43

Doğrulamak için aşağıdaki normal ifadeyi kullanın:

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

Bu benim için AA / gg / yyyy için çalışıyor.


3
Biz doğrular nasıl yyyy-aa-gg gibi veya geçersiz tarih 9834-66-43
Sandeep Singh

7
/ ^ [0-9] {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [1-2] [0-9] | 3 [0-1]) $ / yyyy-aa-gg'yi doğrulamak için.
Ravi Kant

2
Bu harika, çünkü ben düzenli ifadeyi formüle etmekten nefret ediyorum ve ikisi verimliliklerini beğeniyorum!
jadrake

5
3000 yılında ne olur? :)
TheOne

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

29

Tüm krediler elian-ebbing'e gider

Sadece tembel olanlar için burada yyyy-aa-gg formatı için işlevin özelleştirilmiş bir sürümünü de sağlıyorum .

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

Bu, baştaki sıfırlar göz ardı edilirken '2020-5-1'i doğru olarak doğrular. İlk olarak yılın kalıbını /^(19|20)\d\d$/, ayın ayını /^(0[0-9]|1[0-2])$/ve /^(0[1-9]|[12][0-9]|3[01])$/ayrıştırmadan önceki günü test ederek çalışmasını sağladım. Sonra işe yaradı, teşekkürler.
Hmerman6006

Ayrıca, tarihin modelini tam olarak yyyy-aa-gg biçiminde test etmek için, bu normal ifade /^\d{4}\-\d{1,2}\-\d{1,2}$/yyyy-aa-gg veya yyyy-md'yi doğru olarak doğrular, bu nedenle her bir tarih bölümünü değil yalnızca uzunluğu doğrular. Kesin yyyy-aa-gg uzunluğu için, /^\d{4}\-\d{2}\-\d{2}$/bunun yerine yıl, ay ve tarihin doğru olduğunu kontrol etmeden kullanın.
Hmerman6006

17

Kullanabilirsin Date.parse()

MDN belgelerinde okuyabilirsiniz

Date.parse () yöntemi, bir tarihin dize gösterimini ayrıştırır ve dize tanınmadıysa veya bazı durumlarda geçersiz tarih değerleri içeriyorsa 1 Ocak 1970, 00:00:00 UTC veya NaN'den bu yana geçen milisaniye sayısını döndürür (örneğin 2015-02-31).

Ve Date.parseisNaN sonucunun olup olmadığını kontrol edin

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

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

  return false;
}

// when is valid date logic

Lütfen Date.parseMDN'de ne zaman kullanılması önerildiğine bakın


1
Date.parse size "46/7/17" gibi bir tarih içeren geçerli bir ayrıştırma verecektir
LarryBud

Yyyy

11

Aa / gg / yyyy biçimindeki tarihler için sorunsuz çalışıyor gibi görünüyor, örneğin:

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

Kodunuzla ilgili yaşadığım tek sorun şuydu:

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

Öğe kimliğinden önce köşeli parantezlerin içinde bir boşluk vardı. Şu şekilde değiştirildi:

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

Çalışmayan veri türüyle ilgili daha fazla ayrıntı olmadan, girdi verecek çok şey yoktur.


9

Verilen dizge doğru biçimde ('AA / GG / YYYY') ise işlev doğru döndürür, aksi takdirde yanlış döndürür. (Bu kodu çevrimiçi buldum ve biraz değiştirdim)

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

İşte geçerli tarihi kontrol etmek için bir pasaj:

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

Gg / AA / yyyy'yi doğrulamak istiyorsanız sorun değil

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

Başlangıç ​​/ başlangıç ​​ve bitiş / bitiş tarihlerini doğrulamak için verilen formatlardan herhangi biri için tarih doğrulamasını gerçekleştirmeyi sağlayan aşağıdaki kodu bulun. Daha iyi yaklaşımlar olabilirdi ama bunu buldular. Sağlanan tarih formatı ve tarih dizesi el ele gider.

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

Aşağıda HTML pasajı

<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();" />

Mükemmel. Aradığım şey buydu.
Turbo

1

Bu kodun çoğunu burada bulunan başka bir gönderiden aldım . Amaçlarım için değiştirdim. Bu, ihtiyacım olan şey için iyi çalışıyor. Durumunuza yardımcı olabilir.

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

Elian Ebbing cevabına benzer, ancak "\", "/", ".", "-", "" sınırlayıcıları destekler

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

günleriniz ve aylarınız geriye doğru.
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
Bu kod soruyu yanıtlayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak, yanıtlayanın uzun vadeli değerini artıracaktır.
thewaywewere

1

An, bunu çözmek için gerçekten iyi bir an. Sadece tarihi kontrol etmek için karmaşıklık eklemek için bir neden göremiyorum ... an bir göz atın: http://momentjs.com/

HTML:

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

Senaryo :

 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

İlk string tarihi js tarih formatına çevrilerek tekrar string formatına çevrilir, ardından orjinal string ile karşılaştırılır.

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

özelleştirilmiş işlevi veya tarih desenini kullanabiliriz. Aşağıdaki kod, gereksiniminize göre özelleştirilmiş işlevdir, lütfen değiştirin.

 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

Bu kadar basit bir konuyla ilgili bu kadar eski bir gönderi görmek alışılmadık bir durum, pek çok yanıtı var, hiçbiri doğru değil. (Hiçbirinin işe yaramadığını söylemiyorum.)

  • Bunun için artık yıl belirleme rutinine gerek yoktur. Dil bizim için bu işe yarayabilir.
  • Bunun için dakikaya gerek yok.
  • Date.parse()yerel tarih dizeleri için kullanılmamalıdır. MDN "ES5'e kadar Date.parse kullanılması önerilmez, dizelerin ayrıştırılması tamamen uygulamaya bağlıydı" diyor. Standart (potansiyel olarak basitleştirilmiş) bir ISO 8601 dizesi gerektirir; diğer formatlar için destek uygulamaya bağlıdır.
  • Ne de gereken new Date(string)o Date.parse kullanması nedeniyle, kullanılacak ().
  • IMO artık gün valide edilmelidir.
  • Doğrulama işlevi, giriş dizesinin beklenen biçimle eşleşmeme olasılığını hesaba katmalıdır. Örneğin, "1a / 2a / 3aaa", "1234567890" veya "ab / cd / efgh".

Örtülü dönüştürmeler içermeyen verimli ve kısa bir çözüm burada. Date kurucusunun 2018-14-29'u 2019-03-01 olarak yorumlama isteğinden yararlanır. Birkaç modern dil özelliği kullanıyor, ancak gerektiğinde bunlar kolayca kaldırılıyor. Ayrıca bazı testleri de dahil ettim.

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

geçerli bir tarih dizesi için true döndürür.


-3
var date = new Date(date_string)

'Invalid Date'geçersiz tarih_dizesi için değişmez değeri döndürür .

Not: Lütfen aşağıdaki yorumlara bakın.


Yanlış: new Date("02-31-2000")verir Thu Mar 02 2000 00:00:00 GMT-0300 (BRT).
falsarella


Çalışmadığı durumlarda kullanım durumu hakkında daha fazla ayrıntı için, lütfen Mozilla'nın Tarih parametreleri dokümantasyonundaki ilk notu okuyun .
falsarella

1
Evet, bunu öncelikle geçici ayrıştırma yazmaya alternatif olduklarını göstermek için bırakıyorum. Yukarıdaki bağlantı yetkilidir. Yine de güzel doktor!
samis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.