web-dev-qa-db-fra.com

Comment valider une date?

J'essaie de vérifier si une date est valide, en ce sens que si quelqu'un entre 2/30/2011, il devrait être erroné.

Comment puis-je faire cela avec n'importe quelle date?

62
Seth Duncan

Un moyen simple de valider une chaîne de date consiste à convertir en un objet de date et à vérifier que, par exemple,.

// Expect input as d/m/y
function isValidDate(s) {
  var bits = s.split('/');
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d && (d.getMonth() + 1) == bits[1];
}

['0/10/2017','29/2/2016','01/02'].forEach(function(s) {
  console.log(s + ' : ' + isValidDate(s))
})

Lorsque vous testez une date de cette manière, seul le mois doit être testé, car si la date est hors limites, le mois changera. Même si le mois est hors limites. Toute année est valide.

Vous pouvez également tester les bits de la chaîne de date:

function isValidDate2(s) {
  var bits = s.split('/');
  var y = bits[2],
    m = bits[1],
    d = bits[0];
  // Assume not leap year by default (note zero index for Jan)
  var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  // If evenly divisible by 4 and not evenly divisible by 100,
  // or is evenly divisible by 400, then a leap year
  if ((!(y % 4) && y % 100) || !(y % 400)) {
    daysInMonth[1] = 29;
  }
  return !(/\D/.test(String(d))) && d > 0 && d <= daysInMonth[--m]
}

['0/10/2017','29/2/2016','01/02'].forEach(function(s) {
  console.log(s + ' : ' + isValidDate2(s))
})

117
RobG

La première fonction isValidDate (s) proposée par RobG fonctionnera-t-elle pour la chaîne de saisie '1/2 /'? Je pense que NON, car l'année n'est pas validée; (

Ma proposition est d'utiliser une version améliorée de cette fonction:

//input in ISO format: yyyy-MM-dd
function DatePicker_IsValidDate(input) {
        var bits = input.split('-');
        var d = new Date(bits[0], bits[1] - 1, bits[2]);
        return d.getFullYear() == bits[0] && (d.getMonth() + 1) == bits[1] && d.getDate() == Number(bits[2]);
}
10
Piotr Kwiatek

Je recommande d'utiliser moment.js. Fournir seulement date à moment le validera, pas besoin de passer le dateFormat.

var date = moment("2016-10-19");

Et puis date.isValid() donne le résultat souhaité.

Se poster ICI

5
olivier cherrier

Cette solution ne traite pas des validations de date évidentes telles que l’assurance que les éléments de date sont des entiers ou que les éléments de date sont conformes aux contrôles de validation évidents tels que le jour supérieur à 0 et inférieur à 32. Cette solution suppose que vous disposez déjà des trois éléments de date année, mois, jour) et que chacun passe déjà des validations évidentes. Compte tenu de ces hypothèses, cette méthode devrait permettre de vérifier simplement si la date existe.

Par exemple, le 29 février 2009 n’est pas une date réelle, mais le 29 février 2008. Lorsque vous créez un nouvel objet Date tel que le 29 février 2009, regardez ce qui se passe (rappelez-vous que les mois commencent à zéro en JavaScript):

console.log(new Date(2009, 1, 29));

Les sorties de ligne ci-dessus: dim. Mars 01 2009 00:00:00 GMT-0800 (PST)

Remarquez comment la date est simplement reportée au premier jour du mois suivant. En supposant que vous ayez les autres validations évidentes en place, cette information peut être utilisée pour déterminer si une date est réelle avec la fonction suivante (Cette fonction permet des mois non nuls pour une entrée plus pratique):

var isActualDate = function (month, day, year) {
    var tempDate = new Date(year, --month, day);
    return month === tempDate.getMonth();
};

Ce n'est pas une solution complète et ne prend pas en compte i18n, mais cela pourrait être rendu plus robuste.

4
Luke Cordingley
var isDate_ = function(input) {
        var status = false;
        if (!input || input.length <= 0) {
          status = false;
        } else {
          var result = new Date(input);
          if (result == 'Invalid Date') {
            status = false;
          } else {
            status = true;
          }
        }
        return status;
      }

cette fonction renvoie une valeur booléenne indiquant si l'entrée donnée est une date valide ou non. ex: 

if(isDate_(var_date)) {
  // statements if the date is valid
} else {
  // statements if not valid
}
4
Dhayalan

Je viens de faire un remake de solution RobG

var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
var isLeap = new Date(theYear,1,29).getDate() == 29;

if (isLeap) {
  daysInMonth[1] = 29;
}
return theDay <= daysInMonth[--theMonth]
1
Javier

C'est JS6 (avec let déclaration). 

function checkExistingDate(year, month, day){ // year, month and day should be numbers
     // months are intended from 1 to 12
    let months31 = [1,3,5,7,8,10,12]; // months with 31 days
    let months30 = [4,6,9,11]; // months with 30 days
    let months28 = [2]; // the only month with 28 days (29 if year isLeap)

    let isLeap = ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);

    let valid = (months31.indexOf(month)!==-1 && day <= 31) || (months30.indexOf(month)!==-1 && day <= 30) || (months28.indexOf(month)!==-1 && day <= 28) || (months28.indexOf(month)!==-1 && day <= 29 && isLeap);

    return valid; // it returns true or false
}

Dans ce cas, j'ai prévu des mois compris entre 1 et 12. Si vous préférez ou utilisez le modèle basé sur 0-11, vous pouvez simplement changer les tableaux avec:

let months31 = [0,2,4,6,7,9,11];
let months30 = [3,5,8,10];
let months28 = [1];

Si votre date est sous la forme jj/mm/aaaa, vous pouvez utiliser les paramètres de fonction de jour, de mois et d’année et le faire pour les récupérer:

let arrayWithDayMonthYear = myDateInString.split('/');
let year = parseInt(arrayWithDayMonthYear[2]);
let month  = parseInt(arrayWithDayMonthYear[1]);
let day = parseInt(arrayWithDayMonthYear[0]);
0
forget_me_alice

Il est regrettable qu'il semble que JavaScript ne dispose pas d'un moyen simple de valider une chaîne de date à ces jours. C’est le moyen le plus simple auquel je puisse penser pour analyser les dates au format "m/j/aaaa" dans les navigateurs modernes (c’est pourquoi il ne spécifie pas le fond à analyser, car il devrait être 10 depuis ES5):

const dateValidationRegex = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
function isValidDate(strDate) {
  if (!dateValidationRegex.test(strDate)) return false;
  const [m, d, y] = strDate.split('/').map(n => parseInt(n));
  return m === new Date(y, m - 1, d).getMonth() + 1;
}

['10/30/2000abc', '10/30/2000', '1/1/1900', '02/30/2000', '1/1/1/4'].forEach(d => {
  console.log(d, isValidDate(d));
});

0
rosenfeld

Ma fonction renvoie true si la date est valide, sinon renvoie false: D

function isDate  (day, month, year){
	if(day == 0 ){
		return false;
	}
	switch(month){
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
			if(day > 31)
				return false;
			return true;
		case 2:
			if (year % 4 == 0)
				if(day > 29){
					return false;
				}
				else{
					return true;
				}
			if(day > 28){
				return false;
			}
			return true;
		case 4: case 6: case 9: case 11:
			if(day > 30){
				return false;
			}
			return true;
		default:
			return false;
	}
}

console.log(isDate(30, 5, 2017));
console.log(isDate(29, 2, 2016));
console.log(isDate(29, 2, 2015));

0
Alejandro Reyes

Salut S'il vous plaît trouver la réponse ci-dessous.Cela se fait en validant la date nouvellement créée

var year=2019;
var month=2;
var date=31;
var d = new Date(year, month - 1, date);
if (d.getFullYear() != year
        || d.getMonth() != (month - 1)
        || d.getDate() != date) {
    alert("invalid date");
    return false;
}
0