Comment obtenir le premier et le dernier jour de la semaine en JavaScript

94

J'ai un today = new Date();objet. J'ai besoin du premier et du dernier jour de la semaine en cours. J'ai besoin des deux variantes pour dimanche et lundi comme jour de début et de fin de la semaine. Je suis un peu confondu maintenant avec un code. Pouvez-vous m'aider?

Petya petrov
la source

Réponses:

189
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6

var firstday = new Date(curr.setDate(first)).toUTCString();
var lastday = new Date(curr.setDate(last)).toUTCString();

firstday
"Sun, 06 Mar 2011 12:25:40 GMT"
lastday
"Sat, 12 Mar 2011 12:25:40 GMT"

Cela fonctionne pour le premier jour = dimanche de cette semaine et le dernier jour = samedi pour cette semaine. L'extension pour qu'elle fonctionne du lundi au dimanche est triviale.

Le faire fonctionner avec le premier et le dernier jour de mois différents est laissé comme un exercice pour l'utilisateur

Raynos
la source
merci, comment je peux faire ça mais quand le premier jour est lundi?
JuanPablo
4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo
40
Pour que cela fonctionne lorsque vous avez des mois différents -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N
2
Un code similaire à la réponse @Rayons, mais cela fonctionnera même pendant d'autres mois et années.J'ai également var curr = new Date('2014-10-01T00:00:00'); // get current date var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week var last = first + 6; // last day is the first day + 6 firstday = new Date(curr.setDate(first)).toUTCString(); lastday = new Date(curr.setDate(curr.getDate()+6)).toUTCString(); corrigé le code de @ RichardN, qui a une petite erreur
Azeez
60
"comme exercice pour l'utilisateur"… vraiment?
adius
62

Soyez prudent avec la réponse acceptée, elle ne règle pas l'heure sur 00:00:00 et 23:59:59, vous pouvez donc avoir des problèmes.

Je recommande d'utiliser Moment.js pour gérer les dates. Pour votre cas:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

Ce n'est qu'un petit cas d'utilisation, c'est vraiment simple de faire beaucoup d'opérations complexes.

Vous pouvez en savoir plus ici: http://momentjs.com/

Bruno Lemos
la source
19
Si vous utilisez moment, utilisez "isoweek" au lieu de "week", sinon la semaine commencera à partir de dimanche et la finira avec samedi donc var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo
Merci les gars qui ont sauvé mon temps :-)
Syed Ehtsham Abbas
1
Pour prendre en compte l'heure sans utiliser moment.js, utilisez Date.setHours: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur
doit être 'isoWeek' et non 'isoweek'
Mayur Saner
Love moment js, l'une des meilleures bibliothèques de date / heure!
Vippy
50

Vous pouvez également utiliser les lignes de code suivantes pour obtenir la première et la dernière date de la semaine:

var curr = new Date;
var firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
var lastday = new Date(curr.setDate(curr.getDate() - curr.getDay()+6));

J'espère que ce sera utile.

Vasant PADHIYAR
la source
2
Oui, mais @totymedii, la réponse de Raynos est fausse pour le 1er mars 2019, j'en ai la preuve, premier jour :: Dim 24 février 2019 08:33:48 GMT dernier jour :: Sam, 02 février 2019 08:33:48 GMT
Deepak Patel
14

Voici un moyen rapide d'obtenir le premier et le dernier jour, quel que soit le jour de début. sachant que:

1 jour = 86 400 000 millisecondes.

Les valeurs des dates JS sont en millisecondes

Recette: déterminez le nombre de jours que vous devez supprimer pour obtenir le jour de début de votre semaine (multipliez par 1 jour de millisecondes). Tout ce qui reste après cela est d'ajouter 6 jours pour obtenir votre jour de fin.

var startDay = 1; //0=sunday, 1=monday etc.
var d = now.getDay(); //get the current day
var weekStart = new Date(now.valueOf() - (d<=0 ? 7-startDay:d-startDay)*86400000); //rewind to start day
var weekEnd = new Date(weekStart.valueOf() + 6*86400000); //add 6 days to get last day
Olivier
la source
3
Cela ne fonctionne pas car les jours ne durent pas toujours 86 400 000 millisecondes grâce à l'heure d'été ...
ValarDohaeris
9

L'excellente (et immuable) bibliothèque date-fns gère cela de la manière la plus concise:

const start = startOfWeek(date);
const end = endOfWeek(date);

Le jour de début par défaut de la semaine est dimanche (0), mais il peut être changé en lundi (1) comme ceci:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});
Freewalker
la source
1
plus 1 pour utiliser date-fns et non moment
CENT1PEDE
@RobG Toute méthode que vous utilisez aura un premier jour de la semaine par défaut.
Freewalker
4

Tu pourrais faire quelque chose comme ça

var today = new Date();
var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (7 - today.getDay() - startDay) % 7);

startDayest un nombre de 0 à 6 où 0 signifie dimanche (c'est-à-dire 1 = lundi, 2 = mardi, etc.).

Krtek
la source
3

SetDatedéfinit le jour du mois. L'utilisation setDateau début et à la fin du mois entraînera une mauvaise semaine

var curr = new Date("08-Jul-2014"); // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6
var firstday = new Date(curr.setDate(first)); // 06-Jul-2014
var lastday = new Date(curr.setDate(last)); //12-Jul-2014

Si vous définissez la date sur 01-juil.-2014, le premier jour sera le 29 juin 2014 et le dernier jour le 05 juin 2014 au lieu de 05 juillet 2014.

Alors surmontez ce problème que j'ai utilisé

var curr = new Date();
day = curr.getDay();
firstday = new Date(curr.getTime() - 60*60*24* day*1000); //will return firstday (ie sunday) of the week
lastday = new Date(curr.getTime() + 60 * 60 *24 * 6 * 1000); //adding (60*60*6*24*1000) means adding six days to the firstday which results in lastday (saturday) of the week
Orchidée
la source
"L' utilisation de setDate au début et à la fin du mois entraînera une mauvaise semaine " pas si elle est utilisée correctement.
RobG
3

Cela fonctionne à travers les changements d'année et de mois.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay())));
}

Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +6)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());
Chris Lang
la source
Maintenant, cela semble redondant. smh
Chris Lang
Et pendant des semaines commencent le lundi?
RobG
@RobG Veuillez vous référer ceci
SHIVA
2

Je recommande d'utiliser Moment.js pour de tels cas. J'avais des scénarios où je devais vérifier l'heure de la date actuelle, cette semaine, ce mois et cette heure de la date des trimestres. Ci-dessus, une réponse m'a aidé alors j'ai pensé à partager le reste des fonctions également.

Simplement pour obtenir l'heure de la date actuelle dans un format spécifique

        case 'Today':
        moment().format("DD/MM/YYYY h:mm A");

        case 'This Week':
          moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");

La semaine commence à partir du dimanche et se termine le samedi si nous utilisons simplement «semaine» comme paramètre pour la fonction endOf, mais pour obtenir le dimanche comme fin de semaine, nous devons utiliser «isoweek».

        case 'This Month':
          moment().endOf('month').format("DD/MM/YYYY h:mm A");

        case 'This Quarter':
          moment().endOf('quarter').format("DD/MM/YYYY h:mm A");

J'ai choisi ce format selon mes besoins. Vous pouvez modifier le format selon vos besoins.

Syed Ehtsham Abbas
la source
2
        //get start of week; QT
    function _getStartOfWeek (date){
        var iDayOfWeek = date.getDay();
        var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ?  -6:1);

        return new Date(date.setDate(iDifference));
    }, 

    function _getEndOfWeek(date){
        return new Date(date.setDate(date.getDate() + (7 - date.getDay()) === 7 ? 0 : (7 - date.getDay()) ));
    }, 

* date actuelle == 30.06.2016 et le lundi est le premier jour de la semaine.

Cela fonctionne également pendant différents mois et années. Testé avec la suite qunit:

entrez la description de l'image ici

        QUnit.module("Planung: Start of week");
    QUnit.test("Should return start of week based on current date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date());
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a sunday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-07-03"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a monday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-06-27"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.module("Planung: End of week");
    QUnit.test("Should return end of week based on current date", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date());
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on sunday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-07-03"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on monday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-27"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 21-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-21"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 28-12-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-12-28"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-01-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-01-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
iach
la source
2
var dt = new Date()  //current date of week
var currentWeekDay = dt.getDay();
var lessDays = currentWeekDay == 0 ? 6 : currentWeekDay-1
var wkStart = new Date(new Date(dt).setDate(dt.getDate()- lessDays));
var wkEnd = new Date(new Date(wkStart).setDate(wkStart.getDate()+6));

Cela sera utile pour n'importe quel scénario de date.

Parth Shah
la source
1

La méthode de krtek est erronée, j'ai testé ceci

var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (6 - today.getDay() - startDay) % 7);

Ça marche

rayking
la source
1

Bien que la question semble obsolète, je dois signaler un problème.
Question: Que se passera-t-il au 1er janvier 2016?
Je pense que la plupart des solutions ci-dessus calculent le début de la semaine comme 27.12.2016. Pour cette raison, je pense que le calcul correct devrait être simplement comme ci-dessous;

var d = new Date(),
    dayInMs = 1000 * 60 * 60 * 24,
    weekInMs = dayInMs * 7,
    startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()).valueOf(),
    todayElapsedTime = d.valueOf() - startOfToday,
    dayDiff = d.getDay() * dayInMs,
    dateDiff = dayDiff + todayElapsedTime, 
    // finally
    startOfWeek = d.valueOf() - dateDiff,
    endOfWeek = startOfWeek + weekInMs - 1;
efkan
la source
0

Bonne suggestion mais vous avez eu un petit problème hier. Vous devriez le changer en:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
Adam
la source
Tous les jours ne durent pas 24 heures lorsque l'heure d'été est observée.
RobG
0

L'approche du moment a fonctionné pour moi pour tous les cas (même si je n'ai pas testé les limites comme la fin d'année, les années bissextiles). Seule correction dans le code ci-dessus est que le paramètre est "isoWeek", si vous souhaitez démarrer la semaine à partir du lundi.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();
pritesh agrawal
la source
0

En utilisant simplement du javascript pur, vous pouvez utiliser la fonction ci-dessous pour obtenir le premier jour et le dernier jour de la semaine avec un jour de réglage libre pour le début de la semaine.

var weekday = [];
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

function getFirstDayOfWeek(date, from) {
    //Default start week from 'Sunday'. You can change it yourself.
    from = from || 'Sunday'; 
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 7 : start);
    d.setDate(diff);
    return d;
};

Le dernier jour de la semaine est juste 6 jours après le premier jour de la semaine

function getLastDayOfWeek(date, from) {
    from = from || 'Sunday';
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 1 : 6 + start);
    d.setDate(diff);
    return d;
};

Tester:

getFirstDayOfWeek('2017-10-16'); //--> Sun Oct 15 2017
getFirstDayOfWeek('2017-10-16', 'Monday'); //--> Mon Oct 16 2017
getFirstDayOfWeek('2017-10-16', 'Tuesday'); //--> Tue Oct 10 2017
user3444693
la source
0

JavaScript

function getWeekDays(curr, firstDay = 1 /* 0=Sun, 1=Mon, ... */) {
  var cd = curr.getDate() - curr.getDay();
  var from = new Date(curr.setDate(cd + firstDay));
  var to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

Manuscrit

export enum WEEK_DAYS {
  Sunday = 0,
  Monday = 1,
  Tuesday = 2,
  Wednesday = 3,
  Thursday = 4,
  Friday = 5,
  Saturday = 6,
}

export const getWeekDays = (
  curr: Date,
  firstDay: WEEK_DAYS = WEEK_DAYS.Monday
): { from: Date; to: Date } => {
  const cd = curr.getDate() - curr.getDay();
  const from = new Date(curr.setDate(cd + firstDay));
  const to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};
Eduardo Cuomo
la source
0

Nous avons ajouté le code jquery qui montre la semaine en cours du lundi au dimanche.

var d = new Date();
var week = [];
var _days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (let i = 1; i <= 7; i++) {
    let first = d.getDate() - d.getDay() + i; 
    let dt = new Date(d.setDate(first));
    var _day = _days[dt.getDay()];
     var _month = _months[dt.getMonth()];
     var _date = dt.getDate();
     if(_date < 10 ){
         _date = '0' +_date;
     }
     var _year = dt.getFullYear();
     var fulldate = _day+' '+_month+' '+_date+' '+_year+' ';
     week.push(fulldate);
  }
console.log(week);
Neeraj Singh
la source
Ce code stocke les jours de la semaine dans un tableau nommé semaine. Le format de la date stockée dans le tableau est Day Mon Date Year signifie qu'il affiche le premier jour de la semaine, puis le mois, la date et l'année.
Neeraj Singh
Comment est ce "code jQuery"? Il existe de nombreuses réponses plus simples utilisant la même technique.
RobG
0

Une vieille question avec beaucoup de réponses, donc une autre ne sera pas un problème. Quelques fonctions générales pour obtenir le début et la fin de toutes sortes d'unités de temps.

Pour startOf et endOf week, le jour de début de la semaine est défini par défaut sur dimanche (0) mais n'importe quel jour peut être dépassé (lundi - 1, mardi - 2, etc.). N'utilise que le calendrier grégorien.

Les fonctions ne modifient pas la date source, donc pour voir si une date est dans la même semaine qu'une autre date (semaine commençant le lundi):

if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) {
  // d is in same week as d1
}

ou dans la semaine en cours commençant le dimanche:

if (d >= startOf('week') && d <= endOf('week')) {
  // d is in the current week
}

// Returns a new Date object set to start of given unit
// For start of week, accepts any day as start
function startOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(d);
  e.setHours(23,59,59,999);
  // Define methods
  let start = {
    second: d => d.setMilliseconds(0),
    minute: d => d.setSeconds(0,0),
    hour  : d => d.setMinutes(0,0,0),
    day   : d => d.setHours(0,0,0,0),
    week  : d => {
      start.day(d);
      d.setDate(d.getDate() - d.getDay() + weekStartDay);
      if (d > e) d.setDate(d.getDate() - 7);
    },
    month : d => {
      start.day(d);
      d.setDate(1);
    },
    year  : d => {
      start.day(d);
      d.setMonth(0, 1);
    },
    decade: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 10);
    },
    century: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 100);
    },
    millenium: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 1000);
    }
  }
  start[unit](d);
  return d;
}

// Returns a new Date object set to end of given unit
// For end of week, accepts any day as start day
// Requires startOf
function endOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(date);
  e.setHours(23,59,59,999);
  // Define methods
  let end = {
    second: d => d.setMilliseconds(999),
    minute: d => d.setSeconds(59,999),
    hour  : d => d.setMinutes(59,59,999),
    day   : d => d.setHours(23,59,59,999),
    week  : w => {
      w = startOf('week', w, weekStartDay);
      w.setDate(w.getDate() + 6);
      end.day(w);
      d = w;
    },
    month : d => {
      d.setMonth(d.getMonth() + 1, 0);
      end.day(d);
    },  
    year  : d => {
      d.setMonth(11, 31);
      end.day(d);
    },
    decade: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 10 + 9);
    },
    century: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 100 + 99);
    },
    millenium: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 1000 + 999);
    }
  }
  end[unit](d);
  return d;
}

// Examples
let d = new Date();

['second','minute','hour','day','week','month','year',
 'decade','century','millenium'].forEach(unit => {
   console.log(('Start of ' + unit).padEnd(18)  + ': ' +
   startOf(unit, d).toString());
   console.log(('End of ' + unit).padEnd(18)  + ': ' +
   endOf(unit, d).toString());
});

RobG
la source
0

Petit changement à la réponse @Chris Lang. si vous voulez que le lundi soit le premier jour, utilisez ceci.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +7)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Merci @Chris Lang

SHIVA
la source