web-dev-qa-db-fra.com

Calculer le dernier jour du mois en JavaScript

Si vous fournissez 0 comme dayValue dans 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 est fait référence à ce comportement à mozilla . Est-ce une fonctionnalité fiable entre navigateurs ou devrais-je envisager d'autres méthodes?

245
Ken
var month = 0; // January
var d = new Date(2008, month + 1, 0);
alert(d); // last day in January

IE 6: Thu Jan 31 00:00:00 CST 2008
IE 7: Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2: Thu Jan 31 00:00:00 CST 2008
Opera 8.54: Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27: Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60: Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)

Les différences de sortie sont dues aux différences dans l'implémentation toString() et non pas parce que les dates sont différentes.

Bien sûr, le fait que les navigateurs identifiés ci-dessus utilisent 0 comme dernier jour du mois précédent ne signifie pas qu'ils continueront de le faire, ou que les navigateurs non répertoriés le feront, mais cela donne de la crédibilité à la conviction que cela devrait fonctionner de la même manière. même manière dans tous les navigateurs.

363
Grant Wagner

J'utiliserais une date intermédiaire avec le premier jour du mois suivant et renverrais la date du jour précédent:

int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);
73
karlipoppins

Je trouve que c'est la meilleure solution pour moi. Laissez l'objet Date le calculer pour vous.

var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);

Définir 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.

59
orad

En termes informatiques, new Date() et regular expression les solutions sont lentes! Si vous voulez un one-liner super rapide (et super-cryptique), essayez ceci un (en supposant que m est au format Jan=1). Je continue d'essayer différents changements de code pour obtenir les meilleures performances.

Ma version actuelle la plus rapide :

Après avoir examiné cette question connexe Vérification d'année bissextile à l'aide d'opérateurs au niveau des bits (vitesse incroyable) et découvert ce que représentaient les nombres magiques 25 et 15, j'ai mis au point cet hybride optimisé de réponses:

function getDaysInMonth(m, y) {
    return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}

Compte tenu du décalage des bits, cela suppose évidemment que vos paramètres m & y sont tous deux des entiers, car le fait de passer des nombres en tant que chaînes produirait 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 provient de @GitaarLab. J'ai donc créé un JSPerf en face à face sur lequel nous pourrons tester: http://jsperf.com/days-in-month-head-to- tête/5


Cela fonctionne sur la base de ma réponse d'année bissextile ici: javascript pour trouver l'année bissextile cette réponse ici Vérification d'année bissextile à l'aide d'opérateurs de bits (vitesse étonnante) 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 de 31 jours ont soit le bit 3 vide et le bit 0 défini, soit le bit 3 défini et bit 0 clair.

Jan = 1  = 0001 : 31 days
Feb = 2  = 0010
Mar = 3  = 0011 : 31 days
Apr = 4  = 0100
May = 5  = 0101 : 31 days
Jun = 6  = 0110
Jul = 7  = 0111 : 31 days
Aug = 8  = 1000 : 31 days
Sep = 9  = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days

Cela signifie que vous pouvez décaler la valeur 3 places avec >> 3, XOR les bits avec l'original ^ m et voir si le résultat est 1 ou 0 en position de bit 0 avec & 1. Remarque: il s'avère que + 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

23
Gone Coding

Mon collègue est tombé sur ce qui suit qui pourrait être une solution plus facile

function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}

volé à http://snippets.dzone.com/posts/show/2099

17
lebreeze

Une légère modification de la solution fournie par lebreeze:

function daysInMonth(iMonth, iYear)
{
    return new Date(iYear, iMonth, 0).getDate();
}
13
Nigel

J'ai récemment eu à faire quelque chose de similaire, voici ce que je suis venu avec:

/**
* Returns a date set to the begining of the month
* 
* @param {Date} myDate 
* @returns {Date}
*/
function beginningOfMonth(myDate){    
  let date = new Date(myDate);
  date.setDate(1)
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);   
  return date;     
}

/**
 * Returns a date set to the end of the month
 * 
 * @param {Date} myDate 
 * @returns {Date}
 */
function endOfMonth(myDate){
  let date = new Date(myDate);
  date.setMonth(date.getMonth() +1)
  date.setDate(0);
  date.setHours(23);
  date.setMinutes(59);
  date.setSeconds(59);
  return date;
}

Transmettez-le dans une date et il renverra une date définie soit au début du mois, soit à la fin du mois.

La fonction begninngOfMonth s’explique assez bien, mais ce qui se passe dans la fonction endOfMonth c’est que j’incrémente le mois au mois suivant, puis que j’utilise setDate(0) pour annuler le 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/setDatehttps://www.w3schools.com/jsref/ jsref_setdate.asp

Je règle ensuite les heures/minutes/secondes à la fin de la journée. Ainsi, 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 original demandait, mais pourrait aider quelqu'un d'autre à la recherche d'une solution similaire.

Edit: Vous pouvez également faire un effort supplémentaire et définir les millisecondes avec setMilliseconds() si vous voulez être plus précis.

4
Eric

Cela fonctionne pour moi. Fournira le dernier jour de l'année et du mois donnés:

var d = new Date(2012,02,0);
var n = d.getDate();
alert(n);
3
Kreeverp

essaye celui-là.

lastDateofTheMonth = new Date(year, month, 0)

exemple:

new Date(2012, 8, 0)

sortie:

Date {Fri Aug 31 2012 00:00:00 GMT+0900 (Tokyo Standard Time)}
3
artsylar

Celui-ci fonctionne bien:

Date.prototype.setToLastDateInMonth = function () {

    this.setDate(1);
    this.setMonth(this.getMonth() + 1);
    this.setDate(this.getDate() - 1);

    return this;
}
1
Josue

Ceci vous donnera le premier et le dernier jour du mois en cours.

Si vous devez changer 'année', supprimez d.getFullYear () et définissez votre année.

Si vous devez changer 'mois', supprimez d.getMonth () et définissez votre année.

var d = new Date();
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var fistDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth(), 1).getDay())];
        var LastDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth() + 1, 0).getDay())]; 
console.log("First Day :" + fistDayOfMonth); 
console.log("Last Day:" + LastDayOfMonth);
alert("First Day :" + fistDayOfMonth); 
alert("Last Day:" + LastDayOfMonth);
1
Himanshu kukreja

Essaye ça:

function _getEndOfMonth(time_stamp) {
    let time = new Date(time_stamp * 1000);
    let month = time.getMonth() + 1;
    let year = time.getFullYear();
    let day = time.getDate();
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            day = 30;
            break;
        case 2:
            if (_leapyear(year))
                day = 29;
            else
                day = 28;
            break
    }
    let m = moment(`${year}-${month}-${day}`, 'YYYY-MM-DD')
    return m.unix() + constants.DAY - 1;
}

function _leapyear(year) {
    return (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
}
0
Yatin Darmwal
function getLastDay(y, m) {
   return 30 + (m <= 7 ? ((m % 2) ? 1 : 0) : (!(m % 2) ? 1 : 0)) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0)); 
}
0
Ashish

définissez le mois dont vous avez besoin pour dater, puis réglez le jour sur zéro, afin que le mois commence dans la fonction date de 1 à 31 puis obtienne le dernier jour ^^

var last = new Date(new Date(new Date().setMonth(7)).setDate(0)).getDate();
console.log(last);
0
ahmed samra

La fonction ci-dessous donne le dernier jour du mois:

function getLstDayOfMonFnc(date)
{
    return new Date(date.getFullYear(), date.getMonth(), 0).getDate()
}

console.log(getLstDayOfMonFnc(new Date(2016, 2, 15)))   // Output : 29
console.log(getLstDayOfMonFnc(new Date(2017, 2, 15)))   // Output : 28
console.log(getLstDayOfMonFnc(new Date(2017, 11, 15)))  // Output : 30
console.log(getLstDayOfMonFnc(new Date(2017, 12, 15)))  // Output : 31

De même, nous pouvons obtenir le premier jour du mois:

function getFstDayOfMonFnc(date)
{
    return new Date(date.getFullYear(), date.getMonth(), 1).getDate()
}

console.log(getFstDayOfMonFnc(new Date(2016, 2, 15)))   // Output : 1
0
Sujay U N

Je sais que c'est juste une question de sémantique, mais j'ai fini par l'utiliser sous cette forme.

var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate();
console.log(lastDay);

Puisque les fonctions sont résolues depuis l'argument interne, vers l'extérieur, cela fonctionne de la même manière.

Vous pouvez alors simplement remplacer l'année et le mois/l'année par les détails requis, que ce soit à partir de la date du jour. Ou un mois/année particulier.

0
Rudi Strydom