JavaScript: obtenga el primer día de la semana a partir de la fecha actual

Resuelto INs asked hace 13 años • 21 respuestas

Necesito la forma más rápida de obtener el primer día de la semana. Por ejemplo: hoy es 11 de noviembre y jueves; y quiero el primer día de esta semana, que es el 8 de noviembre, y un lunes. Necesito el método más rápido para la función de mapa de MongoDB, ¿alguna idea?

INs avatar Nov 11 '10 23:11 INs
Aceptado

Usando el getDaymétodo de los objetos Fecha, puede saber el número de días de la semana (siendo 0=domingo, 1=lunes, etc.).

Luego puedes restar esa cantidad de días más uno, por ejemplo:

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

console.log( getMonday(new Date()) ); // e.g. Mon Nov 08 2010
Expandir fragmento

Christian C. Salvadó avatar Nov 11 '2010 16:11 Christian C. Salvadó

No estoy seguro de cómo se compara el rendimiento, pero esto funciona.

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
console.log(today); // will be Monday
Expandir fragmento

O como función:

# modifies _date_
function setToMonday( date ) {
    var day = date.getDay() || 7;  
    if( day !== 1 ) 
        date.setHours(-24 * (day - 1)); 
    return date;
}

setToMonday(new Date());
user113716 avatar Nov 11 '2010 16:11 user113716

La respuesta de CMS es correcta pero supone que el lunes es el primer día de la semana.
La respuesta de Chandler Zwolle es correcta pero juega con el prototipo de Date.
Otras respuestas que suman/restan horas/minutos/segundos/milisegundos son incorrectas porque no todos los días tienen 24 horas.

La siguiente función es correcta y toma una fecha como primer parámetro y el primer día de la semana deseado como segundo parámetro (0 para domingo, 1 para lunes, etc.). Nota: la hora, los minutos y los segundos se ponen a 0 para tener el inicio del día.

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)
Expandir fragmento

Louis Ameline avatar Aug 19 '2018 14:08 Louis Ameline