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

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

 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. L’estensione per eseguire da lunedì a domenica è banale.

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

Fai attenzione alla risposta accettata, non imposta l’ora alle 00:00:00 e alle 23:59:59, quindi puoi avere problemi.

Raccomando 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, è molto semplice fare molte operazioni complesse.

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

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 sarà utile ..

Ecco un modo rapido per ottenere il primo e l’ultimo giorno, per qualsiasi giorno di inizio. sapendo che:

1 giorno = 86.400.000 millisecondi.

I valori delle date JS sono espressi in millisecondi

Ricetta: capire quanti giorni è necessario rimuovere per ottenere il giorno di inizio della settimana (moltiplicare per 1 giorno di millisecondi). Tutto ciò che rimane dopo è aggiungere 6 giorni per ottenere il tuo giorno di fine.

 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 

Raccomando di utilizzare Moment.js per questi casi. Avevo degli scenari in cui dovevo controllare l’ora corrente, questa settimana, questo mese e l’ora della data di questo trimestre. Sopra una risposta mi ha aiutato così ho pensato di condividere anche il resto delle funzioni.

Semplicemente per ottenere l’ora corrente nel 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 “settimana” come parametro per la funzione endOf, ma per ottenere domenica come fine della 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à. È ansible modificare il formato in base alle proprie esigenze.

SetDate imposta il giorno del mese. L’utilizzo di setDate durante l’inizio e la fine del mese, si tradurrà 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 Date è 01-Jul-2014, verrà mostrato come primo giorno come 29-Jun-2014 e l’ultimo giorno come 05-Jun-2014 anziché 05-Jul-2014

Quindi superare 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 

Funziona in base alle modifiche 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()); 

L’eccellente (e immutabile) libreria data-fns gestisce questo in modo conciso:

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

Il metodo di krtek ha sbagliato, l’ho provato

 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

Potresti fare qualcosa di simile

 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 Sunday (cioè 1 = lunedì, 2 = martedì, ecc.).

Bel suggerimento ma hai avuto un piccolo problema l’ultimo giorno. Dovresti cambiarlo in:

 lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000); 
  //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 lunedì è il primo giorno della settimana.

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

inserisci la descrizione dell'immagine qui

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

Anche se la domanda sembra obsoleta, devo segnalare un problema.
Domanda: cosa succederà al 1 ° gennaio 2016?
Penso che la maggior parte delle soluzioni di cui sopra calcola l’inizio della settimana il 27.12.2016. Per questo motivo, penso che il calcolo corretto dovrebbe essere come il seguente semplicemente;

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

L’approccio per il momento ha funzionato per me per tutti i casi (anche se non ho messo alla prova i confini come la fine dell’anno, gli anni bisestili). Solo la correzione nel codice sopra è il parametro è “isoWeek”, se si desidera iniziare la settimana dal lunedì.

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

Usando puro javascript, puoi usare la funzione qui sotto per ottenere il primo giorno e l’ultimo giorno di una settimana con il giorno impostato liberamente 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