170 votes

JavaScript calcule le jour de l'année (1 - 366)

Comment utiliser JavaScript pour calculer le jour de l'année, de 1 à 366 ?

Par exemple :

  • January 3 devrait être 3 .
  • February 1 devrait être 32 .

4 votes

var days = new Date().getFullYear() % 4 == 0 ? 366 : 365;

0 votes

Mais vraiment, je ne suis pas sûr de ce que vous voulez dire. Vous voulez juste le nombre de jours dans l'année ? Ou entre deux dates ?

20 votes

Fyi @xeon06, le calcul des années bissextiles est un peu plus compliqué que de moduler par 4. voir : algorithme des années bissextiles

8voto

Play_it Points 105
Math.floor((Date.now() - Date.parse(new Date().getFullYear(), 0, 0)) / 86400000)

voici ma solution

7voto

vusan Points 1789

Si on utilise moment.js, on peut obtenir ou même définir le jour de l'année.

moment().dayOfYear();
//for getting 

moment().dayOfYear(Number); 
//for setting 

moment.js utilise ce code pour le calcul du jour de l'année

6voto

Amaury Liet Points 3019

Si vous ne voulez pas réinventer la roue, vous pouvez utiliser l'excellent logiciel date-fns (node.js) :

var getDayOfYear = require('date-fns/get_day_of_year')

var dayOfYear = getDayOfYear(new Date(2017, 1, 1)) // 1st february => 32

5voto

user7331530 Points 100
const dayOfYear = date => {
    const myDate = new Date(date);
    const year = myDate.getFullYear();
    const firstJan = new Date(year, 0, 1);
    const differenceInMillieSeconds = myDate - firstJan;
    return (differenceInMillieSeconds / (1000 * 60 * 60 * 24) + 1);
};

const result = dayOfYear("2019-2-01");
console.log(result);

4voto

minitech Points 87225

Si je comprends bien, vous voulez 366 pour une année bissextile, 365 sinon, non ? Une année est bissextile si elle est divisible par 4, mais pas par 100, sauf si elle est aussi divisible par 400 :

function daysInYear(year) {
    if(year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {
        // Leap year
        return 366;
    } else {
        // Not a leap year
        return 365;
    }
}

Modifier après la mise à jour :

Dans ce cas, je ne pense pas qu'il y ait une méthode intégrée ; vous devrez le faire :

function daysInFebruary(year) {
    if(year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {
        // Leap year
        return 29;
    } else {
        // Not a leap year
        return 28;
    }
}

function dateToDay(date) {
    var feb = daysInFebruary(date.getFullYear());
    var aggregateMonths = [0, // January
                           31, // February
                           31 + feb, // March
                           31 + feb + 31, // April
                           31 + feb + 31 + 30, // May
                           31 + feb + 31 + 30 + 31, // June
                           31 + feb + 31 + 30 + 31 + 30, // July
                           31 + feb + 31 + 30 + 31 + 30 + 31, // August
                           31 + feb + 31 + 30 + 31 + 30 + 31 + 31, // September
                           31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30, // October
                           31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, // November
                           31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, // December
                         ];
    return aggregateMonths[date.getMonth()] + date.getDate();
}

(Oui, j'ai vraiment fait ça sans copier ni coller. S'il y a un moyen facile, je serai furieux)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X