Pourquoi ne pas simplement ignorer l'expression rationnelle ici? Je sais que c'est façon plus de code, mais il donnera des erreurs pour les dates qu'une regex ne peut pas, comme une date spécifiant le 31 Novembre.
var datesToTest = [
"1991-12-01" // valid
, "1991-11-31" // invalid, Nov has 30 days
, "1991-13-01" // invalid, no 13th month
];
// Note: console.log() requires Firebug - switch to alert() if you wish
for (var i = 0; i < datesToTest.length; i++)
{
if (!isValidDate(datesToTest[i], '-'))
{
console.log(datesToTest[i] + ' is not a valid date!');
} else {
console.log(datesToTest[i] + ' is valid date!');
}
}
function isValidDate(dateAsString, delimiter)
{
var dateObject = new Date(dateAsString.replace(new RegExp(delimiter, 'g'), '/'));
var checkDate = [
dateObject.getFullYear()
, zeroFill(dateObject.getMonth() + 1, 2)
, zeroFill(dateObject.getDate(), 2)
].join(delimiter);
return (dateAsString == checkDate);
}
function zeroFill(number, width)
{
width -= number.toString().length;
if (width > 0)
{
return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number;
}
return number;
}
Cela fonctionne aussi longtemps que vous n'avez pas besoin de valider une date avant 100 AD = P
Je ne veux pas ajouter une réponse puisque celui-ci est juste, mais je vais signaler Pour l'amour d'Ian, le modèle est assez libéral comme c'est le cas actuellement. Par exemple, dans le modèle actuel "1991-50-42" passerait comme une date valide. – EBGreen
Oui, il y a un autre code que je n'ai pas montré pour des raisons esthétiques qui vérifie chaque élément dans les matchs. –
Pourquoi ne pas simplement avoir le motif regex au moins s'assurer que la chaîne * pourrait * être une date? – EBGreen