Comment valider la date au format «mm / jj / aaaa» en JavaScript?

107

Je souhaite valider le format de la date sur une entrée en utilisant le format mm/dd/yyyy.

J'ai trouvé les codes ci-dessous dans un site, puis je les ai utilisés mais cela ne fonctionne pas:

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

Une suggestion sur ce qui pourrait ne pas aller?

mat
la source
3
Bienvenue dans StackOverflow. Vous pouvez formater le code source avec le {}bouton de la barre d'outils. Je l'ai fait pour toi cette fois. Essayez également de fournir des informations sur votre problème: une description ne fonctionne pas est une solution utile pour résoudre le problème.
Álvaro González
Quel type de formats de date essayez-vous de valider? Pouvez-vous donner des exemples de dates qui devraient être valides?
Niklas
manishprajapati.in/blog/…
Manish Prajapati

Réponses:

188

Je pense que Niklas a la bonne réponse à votre problème. En plus de cela, je pense que la fonction de validation de date suivante est un peu plus facile à lire:

// 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];
};
Elian Ebbing
la source
9
Rappelez - vous d'utiliser le second argument parseInt: parseInt(parts[0], 10). Sinon, septembre 09est lu comme un octal et analyse à 0
hugomg
1
Quelques années plus tard et cela m'a fait gagner pas mal de temps, merci pour la douce réponse!
PsychoMantis
1
Excellent post! Combine la mise en forme regex avec l'analyse nécessaire pour la validation.
James Drinkard
4
Je vous suggère de changer l'expression régulière en ceci: / ^ (\ d {2} | \ d {1}) \ / (\ d {2} | \ d {1}) \ / \ d {4} $ / this manière qu'il attrape un mois et un jour de chiffre 1/5/2014. Merci pour l'échantillon!
Mitch Labrador
1
C'est la réponse la plus compacte, efficace et élégante. Cela devrait être celui accepté
Zorgatone
122

J'utiliserais Moment.js pour la validation de la date.

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

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

truela valeur est pour l'analyse stricte du crédit à @Andrey Prokhorov, ce qui signifie

vous pouvez spécifier un booléen pour le dernier argument pour que Moment utilise une analyse stricte. Une analyse stricte nécessite que le format et l'entrée correspondent exactement, y compris les délimiteurs.

Razan Paul
la source
23
+1 Je dois absolument soutenir cela comme la seule réponse extrêmement correcte parmi toutes celles soumises! Vous NE voulez PAS faire quelque chose d'aussi complexe que l'analyse de date par vous-même!
Theodore R. Smith
6
Utilisez "M / D / YYYY" pour autoriser 1 à 2 chiffres pour le mois et le jour.
James à Indy le
3
bon à savoir que le troisième paramètre "vrai" reste pour "utiliser l'analyse stricte" momentjs.com/docs/#/parsing/string-format
Andrey Prokhorov
@Razan Paul espère que cela ne vous dérangeait pas, j'ai ajouté peu d'explications pour plus de clarté. il est sage de ne pas réinventer les roues encore et encore, donc la réponse de pual est la meilleure à mon humble avis
Kick Buttowski le
1
moment (dateString, 'MM / JJ / AAAA', vrai) .isValid () || moment (dateString, 'M / JJ / AAAA', vrai) .isValid () || moment (dateString, 'MM / D / YYYY', vrai) .isValid ();
Yoav Schniederman
43

Utilisez l'expression régulière suivante pour valider:

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

Cela fonctionne pour moi pour MM / jj / aaaa.

Ravi Kant
la source
3
Comment nous validerons aaaa-mm-jj ou une date invalide comme 9834-66-43
Sandeep Singh
7
Vous pouvez utiliser / ^ [0-9] {4} - (0 [1-9] | 1 [0-2]) - (0 [1-9] | [1-2] [0-9] | 3 [0-1]) $ / pour valider aaaa-mm-jj.
Ravi Kant du
2
c'est génial, car je déteste pour une formulation regex et deux aiment leur efficacité!
jadrake
5
Que se passe-t-il en l'an 3000? :)
TheOne
4
@ TheOne..y3k problem ..: P
Sathesh
29

Tous les crédits vont à elian-ebbing

Juste pour les paresseux ici, je propose également une version personnalisée de la fonction pour le format aaaa-mm-jj .

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];
}
Matija
la source
Cela valide '2020-5-1' comme vrai tandis que les zéros non significatifs sont ignorés. Je l'ai fait fonctionner en testant d'abord le modèle de l'année avec /^(19|20)\d\d$/, le mois avec /^(0[0-9]|1[0-2])$/et le jour avec /^(0[1-9]|[12][0-9]|3[01])$/avant l'analyse. Ensuite, cela a fonctionné grâce.
Hmerman6006
Aussi pour tester le modèle de la date au format exactement aaaa-mm-jj, cette regex /^\d{4}\-\d{1,2}\-\d{1,2}$/validera aaaa-mm-jj ou aaaa-md comme vrai, donc elle ne valide que la longueur et non chaque partie de date individuelle. Pour une longueur précise de aaaa-mm-jj sans vérifier que l'année, le mois et la date sont corrects, utilisez à la /^\d{4}\-\d{2}\-\d{2}$/place.
Hmerman6006
17

Vous pourriez utiliser Date.parse()

Vous pouvez lire dans la documentation MDN

La méthode Date.parse () analyse une représentation sous forme de chaîne d'une date et renvoie le nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 UTC ou NaN si la chaîne n'est pas reconnue ou, dans certains cas, contient des valeurs de date illégales (par exemple, 31/02/2015).

Et vérifiez si le résultat de 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

Veuillez jeter un oeil à quand est recommandé d'utiliser Date.parsedans MDN

Mario
la source
1
Date.parse vous donnera une analyse valide avec une date telle que "46/7/17"
LarryBud
Renvoie le vrai résultat pour aaaa / 02/30
Raimonds
11

Cela semble fonctionner correctement pour les dates au format mm / jj / aaaa, par exemple:

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

Le seul problème que j'ai eu avec votre code était le fait que:

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

Il y avait un espace entre les crochets, avant l'ID d'élément. Changé en:

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

Sans plus de détails sur le type de données qui ne fonctionnent pas, il n'y a pas grand-chose d'autre à donner.

Niklas
la source
9

La fonction retournera true si la chaîne donnée est au bon format ('MM / JJ / AAAA') sinon elle retournera false. (J'ai trouvé ce code en ligne et je l'ai un peu modifié)

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

Ganesh
la source
4

Voici un extrait de code pour vérifier la date de validité:

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

Daniel Tran
la source
3

C'est ok si vous voulez vérifier valider jj / MM / aaaa

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
            

échelon
la source
2

Trouvez dans le code ci-dessous qui permet d'effectuer la validation de date pour n'importe quel format fourni pour valider les dates de début / de et de fin / à. Il pourrait y avoir de meilleures approches, mais cela a été proposé. Notez que le format de date fourni et la chaîne de date vont de pair.

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

Ci-dessous l'extrait de code 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();" />
Dinesh Lomte
la source
Excellent. C'est ce que je cherchais.
Turbo
1

J'ai tiré la plupart de ce code d'un autre article trouvé ici . Je l'ai modifié pour mes besoins. Cela fonctionne bien pour ce dont j'ai besoin. Cela peut aider avec votre situation.

$(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 );
});
sknight
la source
1

Similaire à la réponse d'Elian Ebbing, mais prend en charge les délimiteurs "\", "/", ".", "-", ""

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; 
}
ihorsl
la source
vos jours et vos mois sont en arrière.
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);
}
Sai Sreenivas
la source
3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la façon et / ou pourquoi il résout le problème améliorerait la valeur à long terme de la réponse.
thewaywewere
1

Le moment est vraiment bon pour le résoudre. Je ne vois pas de raison d'ajouter de la complexité juste pour vérifier la date ... jetez un œil au moment: 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';
    }   
};
Doug Mugnos
la source
0

La première date de chaîne est convertie au format de date js et reconvertie en format de chaîne, puis elle est comparée à la chaîne d'origine.

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);
}
ctw_87
la source
0

nous pouvons utiliser une fonction personnalisée ou un modèle de date. Le code ci-dessous est une fonction personnalisée selon vos besoins, veuillez le modifier.

 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;

         }
        }
VIKRAM
la source
0

Il est inhabituel de voir un article si ancien sur un sujet aussi basique, avec autant de réponses, aucune d'elles n'est correcte. (Je ne dis pas qu'aucun d'entre eux ne fonctionne.)

  • Une routine de détermination des années bissextiles n'est pas nécessaire pour cela. La langue peut faire cela pour nous.
  • Le moment n'est pas nécessaire pour cela.
  • Date.parse()ne doit pas être utilisé pour les chaînes de date locales. MDN déclare: "Il n'est pas recommandé d'utiliser Date.parse car jusqu'à ES5, l'analyse des chaînes dépendait entièrement de l'implémentation." La norme requiert une chaîne ISO 8601 (potentiellement simplifiée); la prise en charge de tout autre format dépend de l'implémentation.
  • Ni devrait new Date(string)être utilisé, car cela utilise Date.parse ().
  • IMO le jour bissextile doit être validé.
  • La fonction de validation doit tenir compte de la possibilité que la chaîne d'entrée ne corresponde pas au format attendu. Par exemple, «1a / 2a / 3aaa», «1234567890» ou «ab / cd / efgh».

Voici une solution efficace et concise sans conversions implicites. Il tire parti de la volonté du constructeur de Date d'interpréter le 2018-14-29 comme le 2019-03-01. Il utilise quelques fonctionnalités de langage moderne, mais celles-ci sont facilement supprimées si nécessaire. J'ai également inclus quelques tests.

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
Jay Dunning
la source
-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; 
        }
    }

renvoie true pour une chaîne de date valide.

Femi Rufus
la source
-3
var date = new Date(date_string)

renvoie le littéral 'Invalid Date'pour toute chaîne date_string non valide.

Remarque: veuillez consulter les commentaires ci-dessous.

Sam est
la source
Faux: new Date("02-31-2000")donne Thu Mar 02 2000 00:00:00 GMT-0300 (BRT).
falsarella
Pour en savoir plus sur le cas d'utilisation où cela ne fonctionne pas, veuillez lire la première note de la documentation des paramètres de date de Mozilla .
falsarella
1
Ouais, je laisse cela principalement pour montrer qu'ils sont des alternatives à l'écriture d'analyses ad hoc. Le lien ci-dessus fait foi. Beau doc ​​cependant!
samis le