So erhalten Sie den ersten und letzten Tag der Woche in JavaScript

93

Ich habe ein today = new Date();Objekt. Ich muss den ersten und letzten Tag der aktuellen Woche bekommen. Ich brauche beide Varianten für Sonntag und Montag als Start- und Endtag der Woche. Ich bin jetzt ein bisschen verwirrt mit einem Code. Kannst du mir helfen?

Petja petrov
quelle

Antworten:

186
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"

Dies funktioniert für den ersten Tag = Sonntag dieser Woche und den letzten Tag = Samstag für diese Woche. Die Verlängerung auf Montag bis Sonntag ist trivial.

Es bleibt dem Benutzer als Übung überlassen, es mit den ersten und letzten Tagen in verschiedenen Monaten zum Laufen zu bringen

Raynos
quelle
danke, wie kann ich das machen aber wenn der erste tag montag ist?
JuanPablo
4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo
40
Damit es funktioniert, wenn Sie verschiedene Monate haben -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N
2
Ein ähnlicher Code wie die Antwort von @Rayons, aber dies wird auch für andere Monate und Jahre 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(); funktionieren. Ich habe nur den Code von @ RichardN korrigiert, der einen kleinen Fehler aufweist
Azeez,
58
"als Übung für den Benutzer" ... wirklich?
Adius
60

Seien Sie vorsichtig mit der akzeptierten Antwort. Sie setzt die Zeit nicht auf 00:00:00 und 23:59:59, sodass Sie Probleme haben können.

Ich empfehle Moment.js zu verwenden, um mit Daten umzugehen. Für Ihren Fall:

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

Dies ist nur ein kleiner Anwendungsfall. Es ist wirklich einfach, viele komplexe Vorgänge auszuführen.

Weitere Informationen finden Sie hier: http://momentjs.com/

Bruno Lemos
quelle
19
Wenn Sie moment verwenden, verwenden Sie "isoweek" anstelle von "week", andernfalls beginnt die Woche ab Sonntag und endet am Samstag var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo
Danke, ihr habt mir Zeit gespart :-)
Syed Ehtsham Abbas
1
Verwenden Sie Date.setHours: curr.setHours (0,0,0,0), um die Zeit ohne Verwendung von moment.js zu berücksichtigen. lastday.setHours (23,59,59,59);
Matadur
Es muss "isoWeek" sein, nicht "isoweek"
Mayur Saner
Liebesmoment js, eine der besten Datums- / Zeitbibliotheken da draußen!
Vippy
49

Sie können auch die folgenden Codezeilen verwenden, um das erste und letzte Datum der Woche abzurufen:

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

Hoffe es wird nützlich sein ..

Vasant PADHIYAR
quelle
2
Ja, aber @totymedii, Raynos Antwort ist falsch für den 1. März 2019, ich habe Beweise dafür, erster Tag :: So, 24. Februar 2019 08:33:48 GMT letzter Tag :: Sa, 02. Februar 2019 08:33:48 GMT
Deepak Patel
14

Hier ist eine schnelle Möglichkeit, den ersten und letzten Tag für jeden Starttag zu ermitteln. wohl wissend, dass:

1 Tag = 86.400.000 Millisekunden.

JS-Datumswerte sind in Millisekunden angegeben

Rezept: Finden Sie heraus, wie viele Tage Sie entfernen müssen, um den Starttag Ihrer Woche zu erhalten (multiplizieren Sie mit 1 Tag Millisekunden). Danach müssen Sie nur noch 6 Tage hinzufügen, um Ihren Endtag zu erreichen.

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
quelle
3
Dies funktioniert nicht, da die Tage dank der Sommerzeit nicht immer 86.400.000 Millisekunden lang sind ...
ValarDohaeris
8

Die ausgezeichnete (und unveränderliche) Datums-FNS-Bibliothek behandelt dies am präzisesten :

const start = startOfWeek(date);
const end = endOfWeek(date);
Freewalker
quelle
1
plus 1 für die Verwendung von date-fns und nicht moment
CENT1PEDE
@RobG Jede Methode, die Sie verwenden, hat einen Standardtag der Woche.
Freewalker
4

Sie könnten so etwas tun

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

Wo startDayist eine Zahl von 0 bis 6, wobei 0 für Sonntag steht (dh 1 = Montag, 2 = Dienstag usw.).

krtek
quelle
3

SetDatewird den Tag des Monats festlegen. Die Verwendung setDatezu Beginn und am Ende des Monats führt zu einer falschen Woche

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

Wenn Sie das Datum auf 01-Jul-2014 einstellen, wird der erste Tag als 29-Jun-2014 und der letzte Tag als 05-Jun-2014 anstelle des 05-Jul-2014 angezeigt

Überwinde also dieses Problem, das ich verwendet habe

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
Orchidee
quelle
"Die Verwendung von setDate zu Beginn und am Ende des Monats führt zu einer falschen Woche ", nicht bei korrekter Verwendung.
RobG
3

Dies funktioniert über Jahres- und Monatsänderungen hinweg.

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
quelle
Das scheint überflüssig. smh
Chris Lang
Und seit Wochen am Montag anfangen?
RobG
@RobG Bitte beziehen Sie sich darauf
SHIVA
2

Ich empfehle, Moment.js für solche Fälle zu verwenden. Ich hatte Szenarien, in denen ich die aktuelle Datumszeit, diese Woche, diesen Monat und die Datums- / Uhrzeit dieses Quartals überprüfen musste. Die obige Antwort hat mir geholfen, also dachte ich, ich würde auch die restlichen Funktionen teilen.

Einfach, um das aktuelle Datum und die Uhrzeit in einem bestimmten Format abzurufen

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

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

Die Woche beginnt am Sonntag und endet am Samstag, wenn wir einfach 'Woche' als Parameter für die endOf-Funktion verwenden, aber um den Sonntag als Ende der Woche zu erhalten, müssen wir 'isoweek' verwenden.

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

Ich habe dieses Format nach meinen Wünschen gewählt. Sie können das Format entsprechend Ihren Anforderungen ändern.

Syed Ehtsham Abbas
quelle
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()) ));
    }, 

* aktuelles Datum == 30.06.2016 und Montag ist der erste Tag in der Woche.

Es funktioniert auch für verschiedene Monate und Jahre. Getestet mit qunit suite:

Geben Sie hier die Bildbeschreibung ein

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

Dies ist für jedes Datumsszenario nützlich.

Parth Shah
quelle
1

krteks Methode hat einige Fehler, ich habe dies getestet

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

Es klappt

Rayking
quelle
1

Obwohl die Frage als veraltet erscheint, muss ich auf ein Problem hinweisen.
Frage: Was wird am 1. Januar 2016 passieren?
Ich denke, die meisten der oben genannten Lösungen berechnen den Wochenbeginn als 27.12.2016. Aus diesem Grund denke ich, dass die korrekte Berechnung einfach wie folgt sein sollte;

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
quelle
0

Netter Vorschlag, aber Sie haben am letzten Tag ein kleines Problem. Sie sollten es ändern in:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
Adam
quelle
Nicht alle Tage sind 24 Stunden lang, an denen Sommerzeit beobachtet wird.
RobG
0

Der Momentansatz hat für mich in allen Fällen funktioniert (obwohl ich die Grenzen wie Jahresende, Schaltjahre nicht getestet habe). Nur Korrektur im obigen Code ist der Parameter "isoWeek", wenn Sie die Woche ab Montag beginnen möchten.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();
Pritesh Agrawal
quelle
0

Wenn Sie nur reines Javascript verwenden, können Sie die folgende Funktion verwenden, um den ersten Tag und den letzten Tag einer Woche abzurufen, wobei der Tag für den Wochenbeginn frei eingestellt werden kann.

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

Der letzte Wochentag ist nur 6 Tage nach dem ersten Wochentag

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

Prüfung:

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

Typoskript

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
quelle
0

Wir haben einen Abfragecode hinzugefügt, der die aktuelle Woche der Tage von Montag bis Sonntag anzeigt.

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
quelle
Dieser Code speichert die Wochentage in einem Array mit dem Namen Woche. Das Format des Datums, das im Array gespeichert ist, ist Tag Mo Datum Jahr bedeutet, dass der erste Tag der Woche, dann Monat, Datum und Jahr angezeigt werden.
Neeraj Singh
Wie ist dieser "jQuery-Code"? Es gibt zahlreiche einfachere Antworten mit derselben Technik.
RobG
0

Eine alte Frage mit vielen Antworten, sodass eine andere kein Problem darstellt. Einige allgemeine Funktionen zum Starten und Beenden aller Arten von Zeiteinheiten.

Für startOf und endOf week ist der Starttag der Woche standardmäßig Sonntag (0), es kann jedoch jeder Tag übergeben werden (Montag - 1, Dienstag - 2 usw.). Verwendet jedoch nur den Gregorianischen Kalender.

Die Funktionen mutieren das Quelldatum nicht, um festzustellen, ob ein Datum in derselben Woche wie ein anderes Datum liegt (Woche ab Montag):

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

oder in der aktuellen Woche ab Sonntag:

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
quelle
0

Kleine Änderung zu @Chris Lang Antwort. Wenn Sie Montag als ersten Tag möchten, verwenden Sie dies.

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

SHIVA
quelle