Come ottenere il primo e l'ultimo giorno della settimana in JavaScript


94

Ho today = new Date();oggetto. Devo ottenere il primo e l'ultimo giorno della settimana corrente. Ho bisogno di entrambe le varianti per domenica e lunedì come giorno di inizio e fine settimana. Sono un po 'confuso ora con un codice. Puoi aiutarmi?

Risposte:


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"

Funziona per il primo giorno = domenica di questa settimana e l'ultimo giorno = sabato per questa settimana. Estenderlo per essere eseguito dal lunedì alla domenica è banale.

Farlo funzionare con il primo e l'ultimo giorno in mesi diversi è lasciato come esercizio per l'utente


grazie, come posso farlo ma quando il primo giorno è lunedì?
JuanPablo

4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo

40
Per farlo funzionare quando hai mesi diversi -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N

2
Un codice simile alla risposta di @Rayons, ma funzionerà anche per altri mesi e anni anche 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 ho corretto il codice di @ RichardN, che sta avendo un piccolo errore
Azeez

60
"come esercizio per l'utente" ... davvero?
adius

62

Fai attenzione alla risposta accettata, non imposta l'ora su 00:00:00 e 23:59:59, quindi potresti avere problemi.

Consiglio di utilizzare Moment.js per gestire le date. Per il tuo caso:

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

Questo è solo un piccolo caso d'uso, è davvero semplice eseguire molte operazioni complesse.

Puoi vedere ulteriori informazioni qui: http://momentjs.com/


19
Se usi il momento usa "isoweek" invece di "week" altrimenti inizierà la settimana da domenica e terminerà con sabato quindi var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo

Grazie ragazzi mi avete risparmiato tempo :-)
Syed Ehtsham Abbas

1
Per tenere conto dell'ora senza utilizzare moment.js, utilizzare Date.setHours: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur

deve essere "isoWeek" non "isoweek"
Mayur Saner

Love moment js, una delle migliori librerie di data / ora in circolazione!
Vippy

50

Puoi anche utilizzare le seguenti righe di codice per ottenere la prima e l'ultima data della settimana:

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

Spero che sia utile ..


2
Sì, ma @totymedii, la risposta di Raynos è sbagliata per il 1 marzo 2019, ne ho la prova, primo giorno :: dom, 24 febbraio 2019 08:33:48 GMT ultimo giorno :: sabato, 02 febbraio 2019 08:33:48 GMT
Deepak Patel

14

Ecco un modo rapido per ottenere il primo e l'ultimo giorno, per qualsiasi giorno di inizio. sapendo ciò:

1 giorno = 86.400.000 millisecondi.

I valori delle date JS sono in millisecondi

Ricetta: calcola quanti giorni devi rimuovere per ottenere il giorno di inizio della settimana (moltiplicare per 1 giorno in millisecondi). Tutto ciò che resta da fare è aggiungere 6 giorni per ottenere il tuo giorno finale.

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

3
Questo non funziona perché i giorni non sono sempre lunghi 86.400.000 millisecondi grazie
all'ora

9

L'eccellente (e immutabile) libreria date-fns gestisce questo in modo più conciso:

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

Il giorno di inizio della settimana predefinito è domenica (0), ma può essere modificato in lunedì (1) in questo modo:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});

1
più 1 per l'utilizzo di date-fns e non di momento
CENT1PEDE

@RobG Qualsiasi metodo che utilizzi avrà un primo giorno della settimana predefinito.
Freewalker

4

Potresti fare qualcosa del genere

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

Dove startDayè un numero da 0 a 6 dove 0 sta per domenica (cioè 1 = lunedì, 2 = martedì, ecc.).


3

SetDatefisserà il giorno del mese. L'utilizzo setDatedurante l'inizio e la fine del mese risulterà in una settimana sbagliata

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

Se si imposta la data è 01-Jul-2014, il primo giorno sarà 29-Jun-2014 e l'ultimo giorno come 05-Jun-2014 invece che 05-Jul-2014

Quindi supera questo problema che ho usato

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

" Utilizzando setDate durante l'inizio e la fine del mese, risulterà in una settimana sbagliata " non se usato correttamente.
RobG,

3

Funziona con i cambiamenti di anno e mese.

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

Ora sembra ridondante. smh
Chris Lang

E per settimane iniziano lunedì?
RobG,

@RobG Si prega di fare riferimento a questo
SHIVA

2

Consiglio di utilizzare Moment.js per questi casi. Avevo scenari in cui dovevo controllare l'ora della data corrente, questa settimana, questo mese e l'ora della data di questo trimestre. Una risposta sopra mi ha aiutato, quindi ho pensato di condividere anche il resto delle funzioni.

Semplicemente per ottenere la data e l'ora corrente in un formato specifico

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

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

La settimana inizia da domenica e finisce sabato se usiamo semplicemente 'week' come parametro per la funzione endOf, ma per ottenere domenica come fine settimana dobbiamo usare '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");

Ho scelto questo formato secondo le mie necessità. È possibile modificare il formato in base alle proprie esigenze.


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

* data corrente == 30.06.2016 e il lunedì è il primo giorno della settimana.

Funziona anche per diversi mesi e anni. Testato con qunit suite:

inserisci qui la descrizione dell'immagine

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

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

Questo sarà utile per qualsiasi scenario di data.


1

Il metodo di Krtek ha qualcosa di sbagliato, l'ho testato

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

Funziona


1

Sebbene la domanda sembri obsoleta, devo segnalare un problema.
Domanda: cosa accadrà il 1 ° gennaio 2016?
Penso che la maggior parte delle soluzioni di cui sopra calcoli l'inizio della settimana come 27.12.2016. Per questo motivo penso che il calcolo corretto dovrebbe essere semplicemente come il seguente;

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;

0

Bel suggerimento ma hai avuto un piccolo problema nell'ultimo giorno. Dovresti cambiarlo in:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);

Non tutti i giorni sono lunghi 24 ore in cui viene osservata l'ora legale.
RobG,

0

L'approccio del momento ha funzionato per me per tutti i casi (anche se non ho testato i confini come fine anno, anni bisestili). L'unica correzione nel codice sopra è che il parametro è "isoWeek", se si desidera iniziare la settimana dal lunedì.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();

0

Semplicemente usando javascript puro, puoi usare la funzione qui sotto per ottenere il primo giorno e l'ultimo giorno della settimana con l'impostazione libera del giorno per l'inizio della settimana.

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

L'ultimo giorno della settimana è solo 6 giorni dopo il primo giorno della settimana

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

Test:

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

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

Dattiloscritto

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

0

Abbiamo aggiunto il codice jquery che mostra la settimana corrente dal lunedì alla domenica.

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

Questo codice memorizza i giorni della settimana in una matrice denominata week. Il formato della data memorizzato nell'array è Day Mon Date Year significa che mostra il primo giorno della settimana, quindi il mese, la data e l'anno.
Neeraj Singh

Come è questo "codice jQuery"? Esistono numerose risposte più semplici che utilizzano la stessa tecnica.
RobG,

0

Una vecchia domanda con molte risposte, quindi un'altra non sarà un problema. Alcune funzioni generali per ottenere l'inizio e la fine di tutti i tipi di unità di tempo.

Per startOf e endOf week, il giorno di inizio della settimana viene impostato automaticamente su domenica (0) ma è possibile passare qualsiasi giorno (lunedì - 1, martedì - 2, ecc.). Tuttavia, utilizza solo il calendario gregoriano.

Le funzioni non modificano la data di origine, quindi per vedere se una data è nella stessa settimana di un'altra data (settimana che inizia il lunedì):

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

o nella settimana in corso a partire dalla domenica:

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


0

Piccola modifica alla risposta di @Chris Lang. se vuoi lunedì come primo giorno usa questo.

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

Thaks @Chris Lang

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.