JavaScript - Holen Sie sich den ersten Tag der Woche ab dem aktuellen Datum

161

Ich brauche den schnellsten Weg, um den ersten Tag der Woche zu erreichen. Zum Beispiel: Heute ist der 11. November und ein Donnerstag; und ich möchte den ersten Tag dieser Woche, den 8. November, und einen Montag. Ich brauche die schnellste Methode für die MongoDB-Kartenfunktion. Irgendwelche Ideen?

INs
quelle
Wenn jedes bisschen Geschwindigkeit entscheidend ist, möchten Sie vielleicht meine Antwort auf Leistung testen. Ich erhalte mit meinen Browsern eine etwas bessere Leistung (mit Ausnahme des IE, der CMS bevorzugt). Natürlich müssten Sie es mit MongoDB testen. Wenn der Funktion ein Datum übergeben wird, das Montag ist, sollte es noch schneller sein, da nur das unveränderte ursprüngliche Datum zurückgegeben wird.
user113716
Ich habe das gleiche Problem und da das Javascript- Datumsobjekt viele Fehler aufweist, verwende ich jetzt datejs.com (hier code.google.com/p/datejs ), eine Bibliothek, die das Fehlverhalten des nativen Datums korrigiert.
Lolol
Der Fragentitel fragt nach dem ersten Tag der Woche, während die Fragenbeschreibung nach dem Datum des letzten Montags fragt. Dies sind eigentlich zwei verschiedene Fragen. Überprüfen Sie meine Antwort, die beide richtig löst.
Louis Ameline

Antworten:

322

Mit der getDayMethode der Datumsobjekte können Sie die Anzahl der Wochentage ermitteln (0 = Sonntag, 1 = Montag usw.).

Sie können dann diese Anzahl von Tagen plus eins subtrahieren, zum Beispiel:

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

getMonday(new Date()); // Mon Nov 08 2010
CMS
quelle
3
Hat diese Funktion einen Fehler? - Wenn das fragliche Datum Donnerstag, der 2., Tag = 4, Diff = 2 - 4 + 1 = -1 ist und das Ergebnis von setDate "der Tag vor dem letzten Tag des Vormonats" ist (siehe dies ).
Izhaki
2
@Izhaki was meinst du? Für den 2. Mai gibt die Funktion den 29. April zurück, was korrekt ist.
Meze
14
Wenn Sonntag der erste Tag der Woche ist, verwenden Sie:diff = d.getDate() - day;
cfree
2
Danke für den Code @SMS. Ich habe eine kleine Wendung gemacht, um genau 0 Stunden am ersten Tag der Woche zu bekommen. d.setHours(0); d.setMinutes(0); d.setSeconds(0);
Awi
3
Übrigens, d.setDate ist veränderlich, es ändert das "d" selbst
Ayyash
53

Ich bin mir nicht sicher, wie die Leistung verglichen wird, aber das funktioniert.

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
alert(today); // will be Monday

Oder als Funktion:

# modifies _date_
function setToMonday( date ) {
    var day = date.getDay() || 7;  
    if( day !== 1 ) 
        date.setHours(-24 * (day - 1)); 
    return date;
}

setToMonday(new Date());
user113716
quelle
4
Dies hätte die Antwort sein sollen, es ist die einzige, die die gestellte Frage beantwortet. Die anderen sind fehlerhaft oder verweisen Sie auf Bibliotheken von Drittanbietern.
OverMars
Cool es funktioniert bei mir! Durch einige Anpassungen bekomme ich sowohl Montag als auch Freitag der Woche ab einem bestimmten Datum cool!
Alexventuraio
10
Dies ist großartig, außer dass diese Funktion "setToMonday" genannt werden sollte, da sie das übergebene Datumsobjekt ändert. GetMonday würde ein neues Datum zurückgeben, das der Montag ist, der auf dem übergebenen Datum basiert. Ein subtiler Unterschied, der mich jedoch nach der Verwendung erwischt hat diese Funktion. Die einfachste Lösung besteht darin, date = new Date(date);die getMonday-Funktion als erste Zeile einzufügen.
Shane
Das ist fantastisch. Eine getSunday-Methode ist noch einfacher! Vielen Dank!
JesusIsMyDriver.dll
4
Diese Antwort ist falsch, da nicht alle Tage 24 Stunden haben, da tagsüber gespart wird. Es kann entweder die Stunde Ihres Datums unerwartet ändern oder bei bestimmten Gelegenheiten sogar den falschen Tag zurückgeben.
Louis Ameline
13

Schauen Sie sich Date.js an

Date.today().previous().monday()
Matt
quelle
1
oder vielleichtDate.parse('last monday');
Anurag
Ich brauche es für die MongoDB-Datenbank. Ich kann also nicht auf date.js verweisen, aber ich danke Ihnen für Ihr Code-Snippet.
INs
1
Ah, ich wusste nicht, dass Sie JS direkt in MongoDB ausführen können. Das ist ziemlich schlau. Hatte angenommen, dass Sie den JS zum Vorbereiten der Abfragedaten verwenden.
Matt
Wie jQuery nicht daran interessiert, eine ganze Bibliothek (egal wie klein) herunterzuziehen, um Zugriff auf eine einfache Funktion zu erhalten.
Der Muffin-Mann
Keine gute Lösung, da es Länder gibt, deren erster Wochentag Sonntag ist.
Stefan Brendle
11

Die Antwort von CMS ist richtig, geht jedoch davon aus, dass Montag der erste Tag der Woche ist.
Chandler Zwolles Antwort ist richtig, spielt aber mit dem Date-Prototyp.
Andere Antworten, die mit Stunden / Minuten / Sekunden / Millisekunden spielen, sind falsch.

Die folgende Funktion ist korrekt und nimmt ein Datum als ersten Parameter und den gewünschten ersten Wochentag als zweiten Parameter (0 für Sonntag, 1 für Montag usw.). Hinweis: Die Stunden, Minuten und Sekunden werden auf 0 gesetzt, um den Beginn des Tages zu haben.

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)

Louis Ameline
quelle
8
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));

Das wird gut funktionieren.

Parth Shah
quelle
4

Ich benutze das

function get_next_week_start() {
   var now = new Date();
   var next_week_start = new Date(now.getFullYear(), now.getMonth(), now.getDate()+(8 - now.getDay()));
   return next_week_start;
}
1nstinct
quelle
3

Diese Funktion verwendet die aktuelle Millisekundenzeit, um die aktuelle Woche zu subtrahieren, und subtrahiert dann eine weitere Woche, wenn das aktuelle Datum auf einem Montag liegt (Javascript zählt ab Sonntag).

function getMonday(fromDate) {
    // length of one day i milliseconds
  var dayLength = 24 * 60 * 60 * 1000;

  // Get the current date (without time)
    var currentDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate());

  // Get the current date's millisecond for this week
  var currentWeekDayMillisecond = ((currentDate.getDay()) * dayLength);

  // subtract the current date with the current date's millisecond for this week
  var monday = new Date(currentDate.getTime() - currentWeekDayMillisecond + dayLength);

  if (monday > currentDate) {
    // It is sunday, so we need to go back further
    monday = new Date(monday.getTime() - (dayLength * 7));
  }

  return monday;
}

Ich habe es getestet, wenn die Woche von einem Monat zum anderen (und auch von Jahren) reicht, und es scheint richtig zu funktionieren.

einord
quelle
3

Guten Abend,

Ich bevorzuge nur eine einfache Erweiterungsmethode:

Date.prototype.startOfWeek = function (pStartOfWeek) {
    var mDifference = this.getDay() - pStartOfWeek;

    if (mDifference < 0) {
        mDifference += 7;
    }

    return new Date(this.addDays(mDifference * -1));
}

Sie werden feststellen, dass dies tatsächlich eine andere Erweiterungsmethode verwendet, die ich verwende:

Date.prototype.addDays = function (pDays) {
    var mDate = new Date(this.valueOf());
    mDate.setDate(mDate.getDate() + pDays);
    return mDate;
};

Wenn Ihre Wochen am Sonntag beginnen, übergeben Sie eine "0" für den Parameter pStartOfWeek wie folgt:

var mThisSunday = new Date().startOfWeek(0);

Wenn Ihre Wochen am Montag beginnen, geben Sie für den Parameter pStartOfWeek eine "1" ein:

var mThisMonday = new Date().startOfWeek(1);

Grüße,

Chandler Zwolle
quelle
2

Erster Tag der Woche

Um das Datum des ersten Wochentags von heute zu erhalten, können Sie Folgendes verwenden:

function getUpcomingSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - dayOfTheWeek + 7);
  return new Date(newDate);
}

console.log(getUpcomingSunday());

Oder um den letzten Tag der Woche von heute zu bekommen:

function getLastSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - (dayOfTheWeek || 7));
  return new Date(newDate);
}

console.log(getLastSunday());

* Abhängig von Ihrer Zeitzone muss der Wochenanfang nicht am Sonntag beginnen, sondern kann am Freitag, Samstag, Montag oder an jedem anderen Tag beginnen, auf den Ihre Maschine eingestellt ist. Diese Methoden werden das erklären.

* Sie können es auch mit folgender toISOStringMethode formatieren :getLastSunday().toISOString()

Lior Elrom
quelle
1

setDate () hat Probleme mit Monatsgrenzen, die in den obigen Kommentaren angegeben sind. Eine saubere Problemumgehung besteht darin, den Datumsunterschied mithilfe von Epochenzeitstempeln anstelle der (überraschend kontraintuitiven) Methoden für das Date-Objekt zu ermitteln. Dh

function getPreviousMonday(fromDate) {
    var dayMillisecs = 24 * 60 * 60 * 1000;

    // Get Date object truncated to date.
    var d = new Date(new Date(fromDate || Date()).toISOString().slice(0, 10));

    // If today is Sunday (day 0) subtract an extra 7 days.
    var dayDiff = d.getDay() === 0 ? 7 : 0;

    // Get date diff in millisecs to avoid setDate() bugs with month boundaries.
    var mondayMillisecs = d.getTime() - (d.getDay() + dayDiff) * dayMillisecs;

    // Return date as YYYY-MM-DD string.
    return new Date(mondayMillisecs).toISOString().slice(0, 10);
}
jtschoonhoven
quelle
1

Hier ist meine Lösung:

function getWeekDates(){
    var day_milliseconds = 24*60*60*1000;
    var dates = [];
    var current_date = new Date();
    var monday = new Date(current_date.getTime()-(current_date.getDay()-1)*day_milliseconds);
    var sunday = new Date(monday.getTime()+6*day_milliseconds);
    dates.push(monday);
    for(var i = 1; i < 6; i++){
        dates.push(new Date(monday.getTime()+i*day_milliseconds));
    }
    dates.push(sunday);
    return dates;
}

Jetzt können Sie das Datum anhand des zurückgegebenen Array-Index auswählen.

Krystian Wieczorek
quelle
0

Ein Beispiel für die rein mathematische Berechnung ohne DateFunktionen.

const date = new Date();
const ts = +date;

const mondayTS = ts - ts % (60 * 60 * 24 * (7-4) * 1000);

const monday = new Date(mondayTS);
console.log(monday.toISOString(), 'Day:', monday.getDay());

const formatTS = v => new Date(v).toISOString();
const adjust = (v, d = 1) => v - v % (d * 1000);

const d = new Date('2020-04-22T21:48:17.468Z');
const ts = +d; // 1587592097468

const test = v => console.log(formatTS(adjust(ts, v)));

test();                     // 2020-04-22T21:48:17.000Z
test(60);                   // 2020-04-22T21:48:00.000Z
test(60 * 60);              // 2020-04-22T21:00:00.000Z
test(60 * 60 * 24);         // 2020-04-22T00:00:00.000Z
test(60 * 60 * 24 * (7-4)); // 2020-04-20T00:00:00.000Z, monday

// So, what does `(7-4)` mean?
// 7 - days number in the week
// 4 - shifting for the weekday number of the first second of the 1970 year, the first time stamp second.
//     new Date(0)          ---> 1970-01-01T00:00:00.000Z
//     new Date(0).getDay() ---> 4

Anton Korneychuk
quelle
0

eine allgemeinere Version davon ... dies gibt Ihnen jeden Tag in der aktuellen Woche basierend auf dem von Ihnen angegebenen Tag.

//returns the relative day in the week 0 = Sunday, 1 = Monday ... 6 = Saturday
function getRelativeDayInWeek(d,dy) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:dy); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

var monday = getRelativeDayInWeek(new Date(),1);
var friday = getRelativeDayInWeek(new Date(),5);

console.log(monday);
console.log(friday);

Andy
quelle
-1

Check out: moment.js

Beispiel:

moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)

Bonus: Funktioniert auch mit node.js

Pixelfreak
quelle
18
Das ist jedoch keine Antwort auf die Frage von OP. Er hat ein Datum, sagen wir 08/07/14 (d / m / y). Er möchte den ersten Tag dieser Woche haben (für mein Gebietsschema wäre dies der Montag, der gerade vergangen ist, oder gestern). Eine Antwort auf seine Frage mit dem Moment wäremoment().startOf('week')
Jeroen Pelgrims
Beachten Sie, dass moment().startOf("week")abhängig von den Ländereinstellungen möglicherweise das Datum des vorherigen Sonntags angegeben wird. In diesem Fall verwenden Sie moment().startOf('isoWeek')stattdessen: runkit.com/embed/wdpi4bjwh6rt
Harm te Molder
PS Docs on startOf(): momentjs.com/docs/#/manipulating/start-of
Harm te Molder