PHP: Die Woche beginnt am Montag, aber “Montag dieser Woche” an einem Sonntag wird zum Montag der nächsten Woche

Lesezeit: 6 Minuten

Benutzer-Avatar
Fernseher

Hier ist eine Zusammenfassung des Problems: Sonntags, strtotime('this week') kehrt Anfang nächster Woche zurück.

In PHP scheint die Woche am Montag zu beginnen. Aber an jedem Tag außer Sonntag, dieser Code

echo date('Y-m-d', strtotime('monday this week', strtotime('last sunday')));

Gibt das Datum des Montags dieser Woche aus, obwohl es so aussieht, als ob es den Montag der letzten Woche ausgeben sollte. Es scheint, als würde PHP in diesem Fall sowohl den Sonntag als auch den Montag als Wochenbeginn behandeln. Es ist jetzt Montag, der 10. Dezember 2012 oder der 10.12.2012. date('Y-m-d', strtotime('sunday last week')) kehrt zurück 2012-12-09 – gestern.

Ist das ein Bug oder übersehe ich etwas? Es scheint, als ob ein so offensichtlicher Fehler ziemlich bekannt sein sollte, aber ich kann nichts darüber finden. Ist die einzige Möglichkeit, den Wochenstart zu bekommen, eine Sonderbehandlung für Sonntage zu verwenden?

$week_offset = (int) 'sunday' == date('l');
$week_start  = strtotime("-$week_offset monday"); // 1 or 0 Mondays ago

  • Vielleicht gibt es Zeitzonen-Spielereien im Gange? Kannst du das mal mit a versuchen Terminzeit das wurde an einen Einheimischen gebunden DateTimeZone? Haben Sie auch den Flux-Kondensator Ihres Servers ausgetauscht? Sie nutzen sich nach einer Weile ab. :p

    – Karl

    10. Dezember 2012 um 9:25 Uhr


  • Ich denke, der erste Wochentag für die PHP-Datumsfunktion ist Sonntag: w | Numerische Darstellung des Wochentags | 0 (für Sonntag) bis 6 (für Samstag)

    – Salmann A

    10. Dezember 2012 um 9:46 Uhr

  • @SalmanA, das dachte ich auch, aber ich bemerkte immer wieder, als ich an der Website arbeitete, dass der Wochenstart am Montag zurückkehrte. Zum Beispiel, date('Y-m-d', strtotime('this week'); gibt das Datum von Montag zurück. Und das große W unter dem Wochenabschnitt des $format-Parameters sagt, dass die Woche am Montag beginnt: php.net/manual/en/function.date.php kursiv_W | ISO-8601 Wochennummer des Jahres, Wochen beginnend am Montag (hinzugefügt in PHP 4.1.0)_kursiv Abgesehen von unbegründeten Behauptungen in Foren- und Blogbeiträgen konnte ich keine Aussage finden, die mit Sicherheit belegen würde, dass die Wochen von PHP am Montag beginnen.

    – tv

    10. Dezember 2012 um 22:02 Uhr


  • @Charles, ich habe das versucht und das gleiche Ergebnis bekommen: $date = new DateTime(); $date->setTimezone(new DateTimeZone('America/Los_Angeles')); $date->setTimestamp(strtotime('last sunday')); echo $date->format('Y-m-d'); Außerdem habe ich nachgesehen, und die quasitronische Flussrate auf meinem Server sollte … unbegrenzt sein. Also, ich glaube nicht, dass das das Problem ist.

    – tv

    10. Dezember 2012 um 22:17 Uhr


  • Ich habe hier einen Fehlerbericht gepostet: bugs.php.net/bug.php?id=63740 Fühlen Sie sich frei, Ihr Feedback hinzuzufügen.

    – Salmann A

    11. Dezember 2012 um 15:20 Uhr

Soweit ich das beurteilen kann, ist das ein Bug. Ich sehe keinen logischen Grund dafür strtotime('this week'); sollte ein zukünftiges Datum zurückgeben. Dies ist ein ziemlich großer Fehler. In meinem speziellen Fall hatte ich eine Rangliste, die die Benutzer mit den meisten Punkten seit Anfang der Woche zeigte. Aber sonntags war es da leer strtotime hat einen Zeitstempel für ein zukünftiges Datum zurückgegeben. Ich hatte Zweifel, weil ich einfach nicht weiß, wie das unbemerkt bleiben konnte, aber ich konnte keine anderen Berichte über diesen Fehler finden.

Danke für all eure Zeit und Hilfe, Leute.

  • Ein bisschen spät hatte ich das gleiche Problem … Sie können dies einfach beheben, indem Sie es tun strtotime('next Monday -1 week'); Dadurch erhalten Sie immer den Montag der aktuellen Woche 😉

    – Frederik Vordeckers

    30. August 2015 um 13:20 Uhr

  • @FrederikVoordeckers tolle Idee! Hat bei mir nicht so funktioniert, aber das hat funktioniert: $this_date_start = new DateTime('next monday'); $this_date_start ->sub(new DateInterval('P7D'));

    – Hafenkranich

    16. März 2017 um 21:28 Uhr


  • Das funktioniert super @FrederikVoordeckers. Aber am Sonntag muss ich verwenden strtotime('sunday this week').

    – Martin

    20. August 2017 um 19:52 Uhr


Diese Antwort ist spät, aber es ist etwas, mit dem ich zu kämpfen habe. Jede Lösung, die ich bisher ausprobiert habe, hat aus dem einen oder anderen Grund nicht funktioniert. Das ist, was ich am Ende hatte, das für mich funktioniert hat. (Obwohl es hübsch aussehen mag, funktioniert es zumindest).

$thisMonday =  strtotime('next Monday -1 week', strtotime('this sunday'));

So erhalten Sie den Montag der aktuellen Woche:

echo date("Y-m-d", strtotime(date('o-\\WW')));

  • An einem Montag, der das Datum des Montags der letzten Woche zurückgibt. echo date('Y-m-d', strtotime(date('o-\\WW'), strtotime('2013-02-18'))); 2013-02-18 ist ein Montag. Der obige Code wird wiederholt 2013-02-11, das ist der vergangene Montag. Unabhängig davon erklärt es nicht, warum PHP ein Datum in der Zukunft zurückgeben sollte, wenn ich “diese Woche” an gebe strtotime

    – tv

    17. Februar 2013 um 23:30 Uhr


  • Ich habe gerade diese Lösung verwendet und strtotime(date(‘o-\\WW’)) gibt denselben Montag zurück, wenn der Basiszeitstempel auch ein Montag ist. Welche PHP-Version verwendest du?

    – Kapsel

    27. November 2013 um 11:35 Uhr

  • @turibe, deine strtotime ist an der falschen Stelle, es sollte sein: echo date('Y-m-d', strtotime(date('o-\\WW', strtotime('2013-02-18'))));

    – Glen-84

    18. Dezember 2013 um 18:53 Uhr

Es ist nicht ideal, aber ich habe darauf zurückgegriffen:

if(date('N') == 7) { 
    $date = date('Y-m-d',strtotime('monday last week'));
} else {
    $date = date('Y-m-d',strtotime('monday this week'));
}

  I think the only problem with your coding is TimeZone.

Lösung:

Stellen Sie Ihre eigene Zeitzone ein. Hier ist das Beispiel meiner eigenen Zeitzone:

Beispiel

   date_default_timezone_set('Asia/Kolkata');


   Set the above line before calling any time function.

Einen schönen Tag noch.

Benutzer-Avatar
anuj arora

Ich denke, anstatt es zu versuchen

echo date('Y-m-d', strtotime('monday this week', strtotime('last sunday')));

du solltest es versuchen

echo date('Y-m-d', strtotime('monday last week'));

Benutzer-Avatar
anuj arora

Versuchen Sie diesen Code

// set current date
$date = date("m/d/Y");
$ts = strtotime($date); // also $ts = time();

// find the year and the current week
$year = date('o', $ts);
$week = date('W', $ts);
// print week for the current date
$i = 1; // 1 denotes the first day of week

$ts = strtotime($year.'W'.$week.$i);
echo $day = date("l", $ts); // generate the name of day
echo "<br>";
echo $day = date("Y-m-d", $ts); // generate the date

Sie erhalten das Datum der aktuellen Woche, wenn Sie am Montag sind, erhalten Sie das Datum dieses Montags.

  • Ich habe in meiner Frage auch gezeigt, wie man das bekommt, aber für halbakademische Zwecke möchte ich wissen, ob dies ein Fehler ist oder ob es einen triftigen Grund für das Verhalten von PHP gibt. Ich kann nicht verstehen, was das sein soll. Wenn es ein Fehler ist, muss ich ihn melden. Aber es scheint verrückt, dass ein Fehler dieser Größe noch nicht gemeldet wurde.

    – tv

    11. Dezember 2012 um 6:01 Uhr

  • @turibe Wie bereits erwähnt, ist dies kein Fehler. PHP betrachtet den Montag als Wochenbeginn, wenn Sie sich dafür entscheiden word type Phrasen. Wenn Sie möchten, dass Sonntag als Wochenstart verwendet wird, müssen Sie einige Problemumgehungen vornehmen.

    – Peon

    11. Dezember 2012 um 7:52 Uhr

  • @DainisAbols Ich weiß, dass PHP den Montag als Wochenbeginn betrachtet. Ich möchte den Sonntag nicht als Wochenstart verwenden. Sonntags, strtotime('this week') kommt nächste Woche zurück. Das scheint ein Fehler zu sein.

    – tv

    11. Dezember 2012 um 10:18 Uhr

1217250cookie-checkPHP: Die Woche beginnt am Montag, aber “Montag dieser Woche” an einem Sonntag wird zum Montag der nächsten Woche

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy