J'ai besoin du moyen le plus rapide pour obtenir le premier jour de la semaine. Par exemple: nous sommes le 11 novembre et un jeudi; et je veux le premier jour de cette semaine, qui est le 8 novembre, et un lundi. J'ai besoin de la méthode la plus rapide pour la fonction de carte MongoDB, des idées?
En utilisant la méthode getDay
des objets Date, vous pouvez connaître le numéro du jour de la semaine (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 comparer les 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 en 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()
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 fonctionnera bien.
La réponse de CMS est correcte mais suppose que lundi est le premier jour de la semaine.
La réponse de Chandler Zwolle est correcte, mais elle manipule le prototype de Date.
Les autres réponses qui jouent avec heure/minutes/secondes/millisecondes sont fausses.
La fonction ci-dessous est correcte et prend une date comme premier paramètre et le premier jour de la semaine souhaité comme deuxième paramètre (0 pour dimanche, 1 pour lundi, etc.). Remarque: l'heure, les minutes et les secondes sont réglées sur 0 pour que le début de la journée commence.
function firstDayOfWeek(dateObject, firstDayOfWeekIndex) {
const dayOfWeek = dateObject.getDay(),
firstDayOfWeek = new Date(dateObject),
diff = dayOfWeek >= firstDayOfWeekIndex ?
dayOfWeek - firstDayOfWeekIndex :
6 - dayOfWeek
firstDayOfWeek.setDate(dateObject.getDate() - diff)
firstDayOfWeek.setHours(0,0,0,0)
return firstDayOfWeek
}
// August 18th was a Saturday
let lastMonday = firstDayOfWeek(new Date('August 18, 2018 03:24:00'), 1)
// outputs something like "Mon Aug 13 2018 00:00:00 GMT+0200"
// (may vary according to your time zone)
document.write(lastMonday)
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;
}
Cette fonction utilise la milliseconde actuelle pour soustraire la semaine en cours, puis soustrait une semaine de plus si la date en cours est un lundi (le javascript compte à partir de 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 avoir juste 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 en fait 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, indiquez un "0" pour le paramètre pStartOfWeek, comme suit:
var mThisSunday = new Date().startOfWeek(0);
De même, si vos semaines commencent le lundi, indiquez un "1" pour le paramètre pStartOfWeek:
var mThisMonday = new Date().startOfWeek(1);
Cordialement,
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;
}
Vous pouvez maintenant choisir la date par index de tableau retourné.
setDate () a des problèmes avec les limites de mois qui sont notées dans les commentaires ci-dessus. Une solution simple consiste à rechercher la différence de date à l'aide des horodatages Epoch plutôt que des 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);
}
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 aussi avec node.js