Double Possible:
La détection d'une “date invalide” instance de Date en JavaScriptJ'ai été en utilisant la suite pour détecter une date valide:
var text = $('#Date').val(); var date = Date.parse(text); if (isNaN(date)) { // Invalid date }
Mais a constaté que la Date.analyser pense que les éléments suivants sont des dates de validité (mm/jj/aaaa)
- 2/30/2011
- 11/31/2011
Tout autre moyen de détecter des dates non valides lorsque le nombre de jours dépasse le nombre total de jours dans le mois?
Mise à JOUR: Un encore plus grand problème, c'est que le plugin jQuery validation ne détecte pas cela comme une date non valide soit!
SOLUTION:
Basé sur @Guffa de commentaires, j'ai créé la fonction suivante pour valider les dates:
function validDate(text) { var date = Date.parse(text); if (isNaN(date)) { return false; } var comp = text.split('/'); if (comp.length !== 3) { return false; } var m = parseInt(comp[0], 10); var d = parseInt(comp[1], 10); var y = parseInt(comp[2], 10); var date = new Date(y, m - 1, d); return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d); }
Réponses
Trop de publicités?Pour vérifier si une date est valide, vous pouvez analyser les composants de la date, de créer un Date
objet à partir d'elle, et de vérifier si les composants dans les données est le même que l'analyse des composants. Si vous créez un Date
objet de compnents qui sont hors de portée, les valeurs de débit à la prochaine/précédente période pour créer une date valide.
Par exemple, new Date(2011,0,42)
permettra de créer un objet qui contient la date 2/11/2011 au lieu de 1/42/2011.
Par l'analyse des composants au lieu de la date complète vous permettra également de contourner le problème avec les différents formats de date. Mon navigateur par exemple s'attendre à un format de date comme y-m-d
plutôt que d' d/m/y
.
Exemple:
var text = '2/30/2011';
var comp = text.split('/');
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
alert('Valid date');
} else {
alert('Invalid date');
}
Si votre format de la date est fixée comme M/D/YYYY
, vous pourriez re-format de l'analyse de la date et de voir si elle correspond à l'entrée:
var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();
Cependant, qui ne tolère pas les espaces ou des zéros numéros.
Si vous n'avez pas besoin de garder l'entrée de l'utilisateur exactement, vous pourriez tout reformater le jour de toute façon et de faire semblant que c'est ce qu'ils ont saisies.
Mais si vous ne pouvez pas le faire, je voudrais analyser les composants moi-même à l'aide d'une RegExp puis de les comparer à des valeurs de l' Date
méthodes.
Vous pouvez écrire un script pour le faire manuellement:
function checkDate(day, month) {
if (month = 4 || month = 6 || month = 9 || month = 11 && day < 30) {
alert("Date is valid")
}
else if (month = 2 && day =< 28) {
alert("Date is valid")
}
else if (month = 1 || month = 3 || month = 5 || month = 7 || month = 8 || month = 10 || month = 12 && day =< 31) {
alert("Date is valid")
}
else {
alert("Date is in-valid")
}
}
OFC, vous aurez également besoin de quelque chose pour surveiller les années bissextiles, mais n'oubliez pas que toute année divisible par 4 et non par 100 est une année bissextile à moins que les deux premiers chiffres de l'année ne soient divisibles par 4. Cela devrait être facile à inclure dans cette fonction.