web-dev-qa-db-fra.com

JavaScript - récupère le premier jour de la semaine à partir de la date du jour

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?

130
INs

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
269
CMS

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());
46
user113716

Départ Date.js

Date.today().previous().monday()
13
Matt
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.

5
Parth Shah

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)
4
Louis Ameline

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;
}
4
1nstinct

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.

3
einord

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,

2
Chandler Zwolle

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é.

1
Krystian Wieczorek

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

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

0
pixelfreak