Si vous fournissez 0
comme dayValue
en Date.setFullYear
vous obtenez le dernier jour du mois précédent:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
Il y a une référence à ce comportement chez mozilla . Est-ce une fonctionnalité fiable pour tous les navigateurs ou dois-je envisager d'autres méthodes?
javascript
date
Ken
la source
la source
Réponses:
Les différences de sortie sont dues à des différences dans l'
toString()
implémentation, pas parce que les dates sont différentes.Bien sûr, ce n'est pas parce que les navigateurs identifiés ci-dessus utilisent 0 comme dernier jour du mois précédent qu'ils continueront à le faire, ou que les navigateurs non répertoriés le feront, mais cela donne de la crédibilité à la croyance que cela devrait fonctionner. de la même manière dans tous les navigateurs.
la source
new Date
est tellement plus lente que les autres méthodes de calcul qu'elle n'apparaît même pas sur le tableau des performancesJ'utiliserais une date intermédiaire avec le premier jour du mois suivant et je retournerais la date du jour précédent:
la source
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
Je trouve que c'est la meilleure solution pour moi. Laissez l'objet Date le calculer pour vous.
Régler le paramètre de jour sur 0 signifie un jour de moins que le premier jour du mois qui est le dernier jour du mois précédent.
la source
new Date
est tellement plus lente qu'elle n'apparaît même pas sur le tableau des performancesEn termes informatiques,
new Date()
et lesregular expression
solutions sont lentes! Si vous voulez une doublure ultra-rapide (et super-cryptique), essayez celle-ci (en supposant qu'ellem
est auJan=1
format). Je continue d'essayer différentes modifications de code pour obtenir les meilleures performances.Ma version la plus rapide actuelle :
Après avoir regardé cette question connexe Vérification de l'année bissextile en utilisant des opérateurs au niveau du bit (vitesse incroyable) et découvert ce que le nombre magique 25 et 15 représentait, j'ai trouvé cet hybride optimisé de réponses:
Compte tenu du décalage binaire, cela suppose évidemment que vos paramètres
m
&y
sont tous deux des entiers, car le passage de nombres sous forme de chaînes entraînerait des résultats étranges.JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Résultats JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Pour une raison quelconque,
(m+(m>>3)&1)
est plus efficace que(5546>>m&1)
sur presque tous les navigateurs.La seule vraie compétition pour la vitesse vient de @GitaarLab, j'ai donc créé un JSPerf en tête à tête pour que nous puissions tester sur: http://jsperf.com/days-in-month-head-to-head/5
Cela fonctionne sur la base de ma réponse de l'année bissextile ici: javascript pour trouver l'année bissextile cette réponse ici Vérification de l'année bissextile en utilisant des opérateurs au niveau du bit (vitesse incroyable) ainsi que la logique binaire suivante.
Une leçon rapide en mois binaires:
Si vous interprétez l'index des mois souhaités (Jan = 1) en binaire, vous remarquerez que les mois avec 31 jours ont soit le bit 3 effacé et le bit 0 défini, soit le bit 3 réglé et le bit 0 effacé.
Cela signifie que vous pouvez décaler la valeur de 3 places avec
>> 3
, XOR les bits avec l'original^ m
et voir si le résultat est1
ou0
à la position 0 en utilisant& 1
. Remarque: Il s'avère que+
c'est légèrement plus rapide que XOR (^
) et(m >> 3) + m
donne le même résultat dans le bit 0.Résultats JSPerf : http://jsperf.com/days-in-month-perf-test/6
la source
:)
La toute première version de réponse que j'ai publiée avait en effet un ensemble de supports inutiles, qui ont été supprimés (pour lesquels je vous ai crédité) afin que nous puissions raser un personnage et nous retrouver avec celui-ci. Je suis toujours reconnaissant pour cette journée amusante, cheers!y
et lesm
variables doivent être des nombres entiers et non des chaînes! Cela provoque des calculs erronés par exemple pour février il en retourne 30. J'ai dû utiliser laparseInt()
fonction pour le faire fonctionner.Mon collègue est tombé sur ce qui pourrait être une solution plus facile
volé à http://snippets.dzone.com/posts/show/2099
la source
Une légère modification de la solution fournie par lebreeze :
la source
return new Date(iYear, 1 + iMonth, 0).getDate();
équivalent à la solution de @ lebreeze.J'ai récemment dû faire quelque chose de similaire, voici ce que j'ai trouvé:
Passez-le dans une date et il renverra une date définie soit au début du mois, soit à la fin du mois.
La
begninngOfMonth
fonction est assez explicite, mais ce qui se passe dans laendOfMonth
fonction est que j'incrémente le mois au mois suivant, puis que j'utilisesetDate(0)
pour faire reculer le jour jusqu'au dernier jour du mois précédent, qui fait partie de la spécification setDate:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp
J'ai ensuite réglé l'heure / minutes / secondes à la fin de la journée, de sorte que si vous utilisez une sorte d'API qui attend une plage de dates, vous pourrez capturer l'intégralité de ce dernier jour. Cette partie pourrait aller au-delà de ce que le message d'origine demande, mais cela pourrait aider quelqu'un d'autre à chercher une solution similaire.
Modifier: vous pouvez également aller plus loin et définir des millisecondes
setMilliseconds()
si vous voulez être très précis.la source
essaye celui-là.
exemple:
production:
la source
Cela fonctionne pour moi. Fournira le dernier jour de l'année et du mois donnés:
la source
Celui-ci fonctionne bien:
la source
Cela vous donnera le mois en cours le premier et le dernier jour.
Si vous devez changer «année», supprimez d.getFullYear () et réglez votre année.
Si vous devez changer le «mois», supprimez d.getMonth () et réglez votre année.
la source
Essaye ça:
la source
La fonction ci-dessous donne le dernier jour du mois:
De même, nous pouvons obtenir le premier jour du mois:
la source
la source
la source
définissez le mois dont vous avez besoin pour la date, puis réglez le jour sur zéro, afin que le mois commence par 1 à 31 dans la fonction de date, puis obtenez le dernier jour ^^
la source
Voici une réponse qui conserve GMT et l'heure de la date initiale
la source
Je sais que c'est juste une question de sémantique, mais j'ai fini par l'utiliser sous cette forme.
Puisque les fonctions sont résolues de l'argument intérieur, vers l'extérieur, cela fonctionne de la même manière.
Vous pouvez alors simplement remplacer l'année et le mois / année par les détails requis, que ce soit à partir de la date actuelle. Ou un mois / une année en particulier.
la source
Si vous avez besoin d'une fin de mois exacte en millisecondes (par exemple dans un horodatage):
la source