Cómo obtener el primer y último día de la semana en JavaScript

94

Tengo today = new Date();objeto. Necesito obtener el primer y último día de la semana actual. Necesito ambas variantes para el domingo y el lunes como día de inicio y finalización de la semana. Ahora estoy un poco confundido con un código. Me puedes ayudar?

Petya petrov
fuente

Respuestas:

189
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6

var firstday = new Date(curr.setDate(first)).toUTCString();
var lastday = new Date(curr.setDate(last)).toUTCString();

firstday
"Sun, 06 Mar 2011 12:25:40 GMT"
lastday
"Sat, 12 Mar 2011 12:25:40 GMT"

Esto funciona para el primer día = domingo de esta semana y el último día = sábado para esta semana. Extenderlo para que se ejecute de lunes a domingo es trivial.

Hacer que funcione con los primeros y últimos días en diferentes meses se deja como un ejercicio para el usuario

Raynos
fuente
gracias, como puedo hacer esto pero cuando el primer dia es lunes?
JuanPablo
4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo
40
Para que funcione cuando tienes diferentes meses -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N
2
Un código similar a la respuesta de @Rayons, pero esto funcionará incluso durante otros meses y años, también var curr = new Date('2014-10-01T00:00:00'); // get current date var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week var last = first + 6; // last day is the first day + 6 firstday = new Date(curr.setDate(first)).toUTCString(); lastday = new Date(curr.setDate(curr.getDate()+6)).toUTCString(); solo he corregido el código de @ RichardN, que está teniendo un pequeño error
Azeez
60
"como ejercicio para el usuario" ... ¿de verdad?
adius
62

Tenga cuidado con la respuesta aceptada, no establece la hora en 00:00:00 y 23:59:59, por lo que puede tener problemas.

Recomiendo usar Moment.js para lidiar con las fechas. Para tu caso:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

Este es solo un pequeño caso de uso, es realmente simple hacer muchas operaciones complejas.

Puede ver más información aquí: http://momentjs.com/

Bruno Lemos
fuente
19
Si usa moment use "isoweek" en lugar de "week", de lo contrario, la semana comenzará a partir del domingo y la terminará con el sábado, así que var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo
Gracias, chicos, me salvaron el tiempo :-)
Syed Ehtsham Abbas
1
Para contabilizar el tiempo sin usar moment.js, use Date.setHours: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur
debe ser 'isoWeek' no 'isoweek'
Mayur Saner
Love moment js, ¡una de las mejores librerías de fecha / hora que existen!
Vippy
50

También puede utilizar las siguientes líneas de código para obtener la primera y la última fecha de la semana:

var curr = new Date;
var firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
var lastday = new Date(curr.setDate(curr.getDate() - curr.getDay()+6));

Espero que te sea de utilidad.

Vasant PADHIYAR
fuente
2
Sí, pero @totymedii, la respuesta de Raynos es incorrecta para el 1 de marzo de 2019, tengo prueba de ello, primer día :: Dom, 24 de febrero de 2019 08:33:48 GMT último día :: Sáb, 02 de febrero de 2019 08:33:48 GMT
Deepak Patel
14

Aquí hay una forma rápida de obtener el primer y último día, para cualquier día de inicio. sabiendo que:

1 día = 86,400,000 milisegundos.

Los valores de las fechas de JS están en milisegundos

Receta: averigüe cuántos días necesita eliminar para obtener el día de inicio de la semana (multiplique por el valor de 1 día en milisegundos). Todo lo que queda después de eso es agregar 6 días para obtener su día final.

var startDay = 1; //0=sunday, 1=monday etc.
var d = now.getDay(); //get the current day
var weekStart = new Date(now.valueOf() - (d<=0 ? 7-startDay:d-startDay)*86400000); //rewind to start day
var weekEnd = new Date(weekStart.valueOf() + 6*86400000); //add 6 days to get last day
Olivier
fuente
3
Esto no funciona porque los días no siempre duran 86,400,000 milisegundos gracias al horario de verano ...
ValarDohaeris
9

La excelente (e inmutable) biblioteca date-fns maneja esto de manera más concisa:

const start = startOfWeek(date);
const end = endOfWeek(date);

El día de inicio predeterminado de la semana es el domingo (0), pero se puede cambiar al lunes (1) de la siguiente manera:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});
Freewalker
fuente
1
más 1 por usar date-fns y no moment
CENT1PEDE
@RobG Cualquier método que utilice tendrá un primer día de la semana predeterminado.
Freewalker
4

Podrías hacer algo como esto

var today = new Date();
var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (7 - today.getDay() - startDay) % 7);

Donde startDayes un número del 0 al 6 donde 0 representa el domingo (es decir, 1 = lunes, 2 = martes, etc.).

krtek
fuente
3

SetDateestablecerá el día del mes. El uso setDatedurante el inicio y el final del mes resultará en una semana incorrecta

var curr = new Date("08-Jul-2014"); // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6
var firstday = new Date(curr.setDate(first)); // 06-Jul-2014
var lastday = new Date(curr.setDate(last)); //12-Jul-2014

Si la fecha de configuración u es 01-jul-2014, se mostrará el primer día como 29-jun-2014 y el último día como 05-jun-2014 en lugar de 05-jul-2014

Así que supera este problema que usé

var curr = new Date();
day = curr.getDay();
firstday = new Date(curr.getTime() - 60*60*24* day*1000); //will return firstday (ie sunday) of the week
lastday = new Date(curr.getTime() + 60 * 60 *24 * 6 * 1000); //adding (60*60*6*24*1000) means adding six days to the firstday which results in lastday (saturday) of the week
Orquídea
fuente
"El uso de setDate durante el inicio y el final del mes resultará en una semana incorrecta ", no si se usa correctamente.
RobG
3

Esto funciona con los cambios de año y mes.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay())));
}

Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +6)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());
Chris Lang
fuente
Ahora eso parece redundante. smh
Chris Lang
¿Y por semanas empezar el lunes?
RobG
@RobG Consulte esto
SHIVA
2

Recomiendo usar Moment.js para tales casos. Tenía escenarios en los que tenía que verificar la fecha y hora actual, esta semana, este mes y la fecha de este trimestre. La respuesta anterior me ayudó, así que pensé en compartir el resto de las funciones también.

Simplemente para obtener la fecha y hora actual en un formato específico

        case 'Today':
        moment().format("DD/MM/YYYY h:mm A");

        case 'This Week':
          moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");

La semana comienza en domingo y termina el sábado si simplemente usamos 'semana' como parámetro para la función endOf, pero para obtener el domingo como final de semana, debemos usar 'isoweek'.

        case 'This Month':
          moment().endOf('month').format("DD/MM/YYYY h:mm A");

        case 'This Quarter':
          moment().endOf('quarter').format("DD/MM/YYYY h:mm A");

Elegí este formato según mi necesidad. Puede cambiar el formato según sus necesidades.

Syed Ehtsham Abbas
fuente
2
        //get start of week; QT
    function _getStartOfWeek (date){
        var iDayOfWeek = date.getDay();
        var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ?  -6:1);

        return new Date(date.setDate(iDifference));
    }, 

    function _getEndOfWeek(date){
        return new Date(date.setDate(date.getDate() + (7 - date.getDay()) === 7 ? 0 : (7 - date.getDay()) ));
    }, 

* fecha actual == 30.06.2016 y el lunes es el primer día de la semana.

También funciona durante diferentes meses y años. Probado con qunit suite:

ingrese la descripción de la imagen aquí

        QUnit.module("Planung: Start of week");
    QUnit.test("Should return start of week based on current date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date());
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a sunday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-07-03"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a monday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-06-27"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.module("Planung: End of week");
    QUnit.test("Should return end of week based on current date", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date());
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on sunday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-07-03"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on monday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-27"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 21-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-21"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 28-12-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-12-28"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-01-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-01-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
iach
fuente
2
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));

Esto será útil para cualquier escenario de fecha.

Parth Shah
fuente
1

El método de krtek tiene algunos errores, probé esto

var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (6 - today.getDay() - startDay) % 7);

funciona

Rayking
fuente
1

Aunque la pregunta parece obsoleta, debo señalar un problema.
Pregunta: ¿Qué pasará el 1 de enero de 2016?
Creo que la mayoría de las soluciones anteriores calculan el inicio de la semana como 27.12.2016. Por esta razón, creo que el cálculo correcto debería ser como el siguiente simplemente;

var d = new Date(),
    dayInMs = 1000 * 60 * 60 * 24,
    weekInMs = dayInMs * 7,
    startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()).valueOf(),
    todayElapsedTime = d.valueOf() - startOfToday,
    dayDiff = d.getDay() * dayInMs,
    dateDiff = dayDiff + todayElapsedTime, 
    // finally
    startOfWeek = d.valueOf() - dateDiff,
    endOfWeek = startOfWeek + weekInMs - 1;
efkan
fuente
0

Buena sugerencia, pero tuvo un pequeño problema el último día. Deberías cambiarlo a:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
Adán
fuente
No todos los días duran 24 horas cuando se observa el horario de verano.
RobG
0

El enfoque de momento funcionó para mí en todos los casos (aunque no he probado los límites como fin de año, años bisiestos). La única corrección en el código anterior es que el parámetro es "isoWeek", si desea comenzar la semana desde el lunes.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();
pritesh agrawal
fuente
0

Simplemente usando javascript puro, puede usar la función a continuación para obtener el primer día y el último día de una semana con la configuración libre del día para el inicio de la semana.

var weekday = [];
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

function getFirstDayOfWeek(date, from) {
    //Default start week from 'Sunday'. You can change it yourself.
    from = from || 'Sunday'; 
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 7 : start);
    d.setDate(diff);
    return d;
};

El último día de la semana es solo 6 días después del primer día de la semana

function getLastDayOfWeek(date, from) {
    from = from || 'Sunday';
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 1 : 6 + start);
    d.setDate(diff);
    return d;
};

Prueba:

getFirstDayOfWeek('2017-10-16'); //--> Sun Oct 15 2017
getFirstDayOfWeek('2017-10-16', 'Monday'); //--> Mon Oct 16 2017
getFirstDayOfWeek('2017-10-16', 'Tuesday'); //--> Tue Oct 10 2017
usuario3444693
fuente
0

JavaScript

function getWeekDays(curr, firstDay = 1 /* 0=Sun, 1=Mon, ... */) {
  var cd = curr.getDate() - curr.getDay();
  var from = new Date(curr.setDate(cd + firstDay));
  var to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

Mecanografiado

export enum WEEK_DAYS {
  Sunday = 0,
  Monday = 1,
  Tuesday = 2,
  Wednesday = 3,
  Thursday = 4,
  Friday = 5,
  Saturday = 6,
}

export const getWeekDays = (
  curr: Date,
  firstDay: WEEK_DAYS = WEEK_DAYS.Monday
): { from: Date; to: Date } => {
  const cd = curr.getDate() - curr.getDay();
  const from = new Date(curr.setDate(cd + firstDay));
  const to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};
Eduardo Cuomo
fuente
0

Hemos agregado el código jquery que muestra la semana actual de días de lunes a domingo.

var d = new Date();
var week = [];
var _days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (let i = 1; i <= 7; i++) {
    let first = d.getDate() - d.getDay() + i; 
    let dt = new Date(d.setDate(first));
    var _day = _days[dt.getDay()];
     var _month = _months[dt.getMonth()];
     var _date = dt.getDate();
     if(_date < 10 ){
         _date = '0' +_date;
     }
     var _year = dt.getFullYear();
     var fulldate = _day+' '+_month+' '+_date+' '+_year+' ';
     week.push(fulldate);
  }
console.log(week);
Neeraj Singh
fuente
Este código almacena los días de la semana en una matriz denominada semana. El formato de fecha que se almacena en la matriz es Día Lun Fecha Año significa que muestra el primer día de la semana, luego el mes, la fecha y el año.
Neeraj Singh
¿Cómo es este "código jQuery"? Existen numerosas respuestas más sencillas que utilizan la misma técnica.
RobG
0

Una pregunta antigua con muchas respuestas, por lo que otra no será un problema. Algunas funciones generales para obtener el inicio y el final de todo tipo de unidades de tiempo.

Para startOf y endOf week, el día de inicio de la semana es el domingo (0) por defecto, pero se puede pasar cualquier día (lunes - 1, martes - 2, etc.). Sin embargo, solo usa el calendario gregoriano.

Las funciones no mutan la fecha de origen, por lo que para ver si una fecha está en la misma semana que otra fecha (la semana comienza el lunes):

if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) {
  // d is in same week as d1
}

o en la semana actual a partir del domingo:

if (d >= startOf('week') && d <= endOf('week')) {
  // d is in the current week
}

// Returns a new Date object set to start of given unit
// For start of week, accepts any day as start
function startOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(d);
  e.setHours(23,59,59,999);
  // Define methods
  let start = {
    second: d => d.setMilliseconds(0),
    minute: d => d.setSeconds(0,0),
    hour  : d => d.setMinutes(0,0,0),
    day   : d => d.setHours(0,0,0,0),
    week  : d => {
      start.day(d);
      d.setDate(d.getDate() - d.getDay() + weekStartDay);
      if (d > e) d.setDate(d.getDate() - 7);
    },
    month : d => {
      start.day(d);
      d.setDate(1);
    },
    year  : d => {
      start.day(d);
      d.setMonth(0, 1);
    },
    decade: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 10);
    },
    century: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 100);
    },
    millenium: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 1000);
    }
  }
  start[unit](d);
  return d;
}

// Returns a new Date object set to end of given unit
// For end of week, accepts any day as start day
// Requires startOf
function endOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(date);
  e.setHours(23,59,59,999);
  // Define methods
  let end = {
    second: d => d.setMilliseconds(999),
    minute: d => d.setSeconds(59,999),
    hour  : d => d.setMinutes(59,59,999),
    day   : d => d.setHours(23,59,59,999),
    week  : w => {
      w = startOf('week', w, weekStartDay);
      w.setDate(w.getDate() + 6);
      end.day(w);
      d = w;
    },
    month : d => {
      d.setMonth(d.getMonth() + 1, 0);
      end.day(d);
    },  
    year  : d => {
      d.setMonth(11, 31);
      end.day(d);
    },
    decade: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 10 + 9);
    },
    century: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 100 + 99);
    },
    millenium: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 1000 + 999);
    }
  }
  end[unit](d);
  return d;
}

// Examples
let d = new Date();

['second','minute','hour','day','week','month','year',
 'decade','century','millenium'].forEach(unit => {
   console.log(('Start of ' + unit).padEnd(18)  + ': ' +
   startOf(unit, d).toString());
   console.log(('End of ' + unit).padEnd(18)  + ': ' +
   endOf(unit, d).toString());
});

RobG
fuente
0

Pequeño cambio en la respuesta de @Chris Lang. si quieres el lunes como primer día, usa esto.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +7)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Gracias @Chris Lang

SHIVA
fuente