JavaScript: obtenga el primer día de la semana a partir de la fecha actual
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?
Usando el getDay
mé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
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
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());
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)