Comment puis-je obtenir le code ci-dessous pour travailler quand j'ai un mois de février? Actuellement, nous arrivons à la journée et puis nous nous arrêtons avant d’arriver au si pour déterminer s’il s’agit d’une année bissextile.
if (month == 2) {
if (day == 29) {
if (year % 4 != 0 || year % 100 == 0 && year % 400 != 0) {
field.focus();
field.value = month +'/' + '';
}
}
else if (day > 28) {
field.focus();
field.value = month +'/' + '';
}
}
Il est plus sûr d’utiliser Les objets Date pour les objets datetime, par exemple.
isLeap = new Date(year, 1, 29).getMonth() == 1
Puisque les gens ne cessent de demander comment cela fonctionne, cela dépend de la façon dont JS calcule la valeur de la date année-mois-jour (détails ici ). Fondamentalement, il calcule d'abord le premier du mois puis y ajoute N -1 jours. Donc, lorsque nous demandons le 29 février pour une année non bissextile, le résultat sera le 1er février + 28 jours = le 1er mars:
> new Date(2015, 1, 29)
< Sun Mar 01 2015 00:00:00 GMT+0100 (CET)
Année bissextile, le 1er + 28 = 29 février:
> new Date(2016, 1, 29)
< Mon Feb 29 2016 00:00:00 GMT+0100 (CET)
Dans le code ci-dessus, je fixe la date au 29 février et vérifie si un basculement a eu lieu. Sinon (le mois est toujours le 1 er février), il s’agit d’une année bissextile, sinon d’une année non bissextile.
Comparé à l'utilisation de new Date()
, il est environ 100 fois plus rapide!
Mise à jour:
Cette dernière version utilise un test de bits des 3 derniers bits (est-ce un multiple de 4), ainsi qu'un contrôle pour l'année étant un multiple de 16 (les 4 derniers bits en binaire est de 15) et un multiple de 25.
ily = function(y) {return !(y & 3 || !(y % 25) && y & 15);};
Il est légèrement plus rapide que ma version précédente (ci-dessous):
ily = function(yr) {return !((yr % 4) || (!(yr % 100) && (yr % 400)));};
Il est également 5% plus rapide que broc.seib, comparé à la version de l'opérateur conditionnel déjà rapide}
Résultats du test de vitesse: http://jsperf.com/ily/6
Résultats attendus du test logique:
alert(ily(1900)); // false
alert(ily(2000)); // true
alert(ily(2001)); // false
alert(ily(2002)); // false
alert(ily(2003)); // false
alert(ily(2004)); // true
alert(ily(2100)); // false
alert(ily(2400)); // true
Correct et rapide:
ily = function(yr) { return (yr%400)?((yr%100)?((yr%4)?false:true):false):true; }
Si vous êtes dans une boucle ou que vous comptez les nanosecondes, cela est deux fois plus rapide que de courir votre année dans un nouvel objet Date (). Comparez la performance ici: http://jsperf.com/ily
isLeap = !(new Date(year, 1, 29).getMonth()-1)
... la soustraction par un devrait fonctionner encore plus rapidement que la comparaison sur la plupart des architectures de CPU.
Meilleur calcul historique des années bissextiles.
Le code ci-dessous prend en compte le fait que les années bissextiles ont été introduites dans 45 avant JC avec le calendrier julien, que la majorité du monde occidental a adopté le calendrier grégorien en 1582 et que 0CE = 1BC.
isLeap = function(yr) {
if (yr > 1582) return !((yr % 4) || (!(yr % 100) && (yr % 400)));
if (yr >= 0) return !(yr % 4);
if (yr >= -45) return !((yr + 1) % 4);
return false;
};
La Grande-Bretagne et ses colonies ont adopté le calendrier grégorien en 1752, donc si vous êtes plus anglo-centrique, cette version est meilleure (nous supposerons que la Grande-Bretagne a adopté le calendrier julien avec une conquête romaine commençant à 43CE).
isLeap = function(yr) {
if (yr > 1752) return !((yr % 4) || (!(yr % 100) && (yr % 400)));
if (yr >= 43) return !(yr % 4);
return false;
};
Vous pouvez facilement faire cela en appelant .isLeapYear()
from momentjs
:
var notLeapYear = moment('2018-02-29')
console.log(notLeapYear.isLeapYear()); // false
var leapYear = moment('2020-02-29')
console.log(leapYear.isLeapYear()); // true
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.21.0/moment.min.js"></script>
J'utilise cela parce que je déteste devoir continuer à parler de janvier avec 0 et de février avec 1. Pour moi et PHP et des dates lisibles, février = 2. Je sais que cela n'a pas vraiment d'importance, car le nombre ne change jamais, mais cela ne fait que garder mon cerveau dans la même pensée d'un code à l'autre.
var year = 2012;
var isLeap = new Date(year,2,1,-1).getDate()==29;
Pseudo-code
if year is not divisible by 4 then not leap year
else if year is not divisible by 100 then leap year
else if year is divisible by 400 then leap year
else not leap year
JavaScript
function isLeapYear (year) {
return year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 )
}
L'utilisation du code ci-dessus vous assure de ne faire qu'un seul contrôle par year
si le year
n'est pas divisible par 4 Simplement en ajoutant les crochets, vous enregistrez 2 contrôles par year
qui n'est pas divisible par 4