JavaScript – obtenez le premier jour de la semaine à partir de la date actuelle

J'ai besoin du meilleur moyen d'obtenir le premier jour de la semaine. Par exemple, aujourd'hui, c'est le 11 novembre et le jeudi, j'ai besoin de convertir cette date au 8 novembre (lundi). J'ai besoin de la méthode la plus rapide pour la gestion de la carte MongoDB, des idées?

    À l'aide de la méthode getDay des objets Date, vous pouvez connaître le nombre de jours de la semaine (soit 0 = dimanche, 1 = lundi, etc.).

    Vous pouvez ensuite soustraire ce nombre de jours plus un, par exemple:

     function getMonday(d) { d = new Date(d); var day = d.getDay(), diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday return new Date(d.setDate(diff)); } getMonday(new Date()); // Mon Nov 08 2010 

    Vous ne savez pas comment cela se compare aux performances, mais cela fonctionne.

     var today = new Date(); var day = today.getDay() || 7; // Get current day number, converting Sun. to 7 if( day !== 1 ) // Only manipulate the date if it isn't Mon. today.setHours(-24 * (day - 1)); // Set the hours to day number minus 1 // multiplied by negative 24 alert(today); // will be Monday 

    Ou comme fonction:

     function getMonday( date ) { var day = date.getDay() || 7; if( day !== 1 ) date.setHours(-24 * (day - 1)); return date; } getMonday(new Date()); 

    Départ Date.js

     Date.today().previous().monday() 

    J'utilise ceci

     function get_next_week_start() { var now = new Date(); var next_week_start = new Date(now.getFullYear(), now.getMonth(), now.getDate()+(8 - now.getDay())); return next_week_start; } 

    Départ: moment.js

    Exemple:

     moment().day(-7); // last Sunday (0 - 7) moment().day(7); // next Sunday (0 + 7) moment().day(10); // next Wednesday (3 + 7) moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7) 

    Bonus: fonctionne avec node.js aussi

    Cette fonction utilise le temps de milliseconde actuel pour soustraire la semaine en cours, puis soustrait une semaine de plus si la date actuelle est le lundi (compte javascript depuis le dimanche).

     function getMonday(fromDate) { // length of one day i milliseconds var dayLength = 24 * 60 * 60 * 1000; // Get the current date (without time) var currentDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate()); // Get the current date's millisecond for this week var currentWeekDayMillisecond = ((currentDate.getDay()) * dayLength); // subtract the current date with the current date's millisecond for this week var monday = new Date(currentDate.getTime() - currentWeekDayMillisecond + dayLength); if (monday > currentDate) { // It is sunday, so we need to go back further monday = new Date(monday.getTime() - (dayLength * 7)); } return monday; } 

    Je l'ai testé lorsque la semaine s'étend d'un mois à l'autre (et aussi des années), et cela semble fonctionner correctement.

    Bonsoir,

    Je préfère simplement avoir une méthode d'extension simple:

     Date.prototype.startOfWeek = function (pStartOfWeek) { var mDifference = this.getDay() - pStartOfWeek; if (mDifference < 0) { mDifference += 7; } return new Date(this.addDays(mDifference * -1)); } 

    Vous remarquerez que cela utilise réellement une autre méthode d'extension que j'utilise:

     Date.prototype.addDays = function (pDays) { var mDate = new Date(this.valueOf()); mDate.setDate(mDate.getDate() + pDays); return mDate; }; 

    Maintenant, si vos semaines commencent le dimanche, passez un "0" pour le paramètre pStartOfWeek, de la manière suivante:

    var mThisSunday = new Date().startOfWeek(0);

    De même, si vos semaines commencent le lundi, passez un "1" pour le paramètre pStartOfWeek:

    var mThisMonday = new Date().startOfWeek(1);

    Cordialement,

    SetDate () a des problèmes avec les limites de mois qui sont notés dans les commentaires ci-dessus. Une solution de rechange propre est de trouver la différence de date à l'aide de timestamps d'époque plutôt que les méthodes (étonnamment contre-intuitives) sur l'objet Date. C'est à dire

     function getPreviousMonday(fromDate) { var dayMillisecs = 24 * 60 * 60 * 1000; // Get Date object truncated to date. var d = new Date(new Date(fromDate || Date()).toISOString().slice(0, 10)); // If today is Sunday (day 0) subtract an extra 7 days. var dayDiff = d.getDay() === 0 ? 7 : 0; // Get date diff in millisecs to avoid setDate() bugs with month boundaries. var mondayMillisecs = d.getTime() - (d.getDay() + dayDiff) * dayMillisecs; // Return date as YYYY-MM-DD string. return new Date(mondayMillisecs).toISOString().slice(0, 10); } 

    Voici ma solution:

     function getWeekDates(){ var day_milliseconds = 24*60*60*1000; var dates = []; var current_date = new Date(); var monday = new Date(current_date.getTime()-(current_date.getDay()-1)*day_milliseconds); var sunday = new Date(monday.getTime()+6*day_milliseconds); dates.push(monday); for(var i = 1; i < 6; i++){ dates.push(new Date(monday.getTime()+i*day_milliseconds)); } dates.push(sunday); return dates; } 

    Maintenant, vous pouvez choisir une date par index de tableau renvoyé.

     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(weekStartDate.getDate()+6)); 

    Cela va bien fonctionner.