web-dev-qa-db-fra.com

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

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

64
Petya petrov
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 firstday = dimanche de cette semaine et dernier jour = samedi pour cette semaine. Le prolonger de lundi à dimanche est trivial.

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

146
Raynos

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

Je recommande d'utiliser Moment.js pour traiter les dates. Pour votre cas:

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

Ceci est juste un petit cas d'utilisation, il est très simple de faire beaucoup d'opérations complexes.

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

45
Bruno Lemos

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 ça vous sera utile.

35
Vasant PADHIYAR

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

1 jour = 86 400 000 millisecondes. 

Les dates JS sont exprimées en millisecondes 

Recette: calculez le nombre de jours à supprimer pour obtenir le jour de début de votre semaine (multipliez par 1 jour de millisecondes) Il ne vous reste plus qu'à ajouter 6 jours pour obtenir votre dernier jour .

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
15
Olivier

L’excellente (et immuable) bibliothèque de date-fns s’occupe de la manière la plus concise:

const start = startOfWeek(date);
const end = endOfWeek(date);
7
Luke Williams

Je recommande d'utiliser Moment.js pour de tels cas. Il y avait des scénarios dans lesquels je devais vérifier l'heure de la date actuelle, cette semaine, ce mois et l'heure de la date du trimestre. Ci-dessus, une réponse m’a aidé, j’ai donc pensé à partager le reste des fonctions.

Simplement pour obtenir l'heure 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 le 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 changer le format selon vos besoins.

5
Syed Ehtsham Abbas

SetDate définit le jour du mois. Utiliser setDate au 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 Date comme étant le 1 er juillet 2014, le premier jour sera 29 juin 2014 et le dernier jour, 5 juin 2014 au lieu de 5 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
3
Orchid

Cela fonctionne avec 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());
3
Chris Lang

la méthode de krtek a un problème, j'ai testé cela

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

2
rayking

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);

startDay est un nombre compris entre 0 et 6, où 0 représente le dimanche (c'est-à-dire 1 = lundi, 2 = mardi, etc.).

2
krtek

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

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
1
Adam
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 tout scénario de date.

1
Parth Shah

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

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;
1
efkan
        //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 du jour == 30.06.2016 et le lundi est le premier jour de la semaine.

Cela fonctionne aussi pour différents mois et années . Testé avec qunit suite:

 enter image description here

        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);
    });
1
iach

L’approche du moment a fonctionné pour moi dans tous les cas (bien que 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 le paramètre "isoWeek", si vous voulez commencer la semaine à partir de lundi.

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

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 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 à peine 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
0
user3444693