2009-02-02 4 views
15

Ich denke, es ist möglich, aber ich kann nicht den richtigen Algorithmus dafür finden.Wie bekomme ich das Datum der letzten Woche (Dienstag oder jeden anderen Tag) in PHP?

Was ich tun wollte, war:

Wenn heute Montag 2. Februar 2009, wie würde ich das Datum der letzten Woche Dienstag wissen? Unter Verwendung dieser gleichen Code 2 Tage nach fallen würde ich das gleiche Datum von Dienstag letzter Woche mit dem aktuellen Datum Mittwoch sein, 4. Februar 2009.

Antwort

17

Ich weiß, dass es bereits eine akzeptierte Antwort gibt, aber imho es nicht die zweite Anforderung erfüllt, die angefordert wurde. In dem obigen Fall würde strtotime gestern ergeben, wenn es an einem Mittwoch verwendet wird. Also, nur um genau zu sein müssen Sie noch für dies überprüfen:

$tuesday = strtotime('last Tuesday'); 
// check if we need to go back in time one more week 
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400 : $tuesday; 

Wie davil in seinem Kommentar darauf hingewiesen, das war ein bisschen ein Schnellschuß von mir. Die obige Berechnung wird aufgrund der Sommerzeit einmal pro Jahr um ein Mal deaktiviert. Die gut genug Lösung wäre:

$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400+7200 : $tuesday; 

Wenn Sie die Zeit brauchen 0 zu sein: 00h, werden Sie etwas mehr Aufwand natürlich brauchen.

+2

Dies funktioniert nicht 1 Woche pro Jahr, wenn Sonntag nur 23 Stunden wegen DST-Umschaltung hat (der resultierende Zeitstempel wird sei für Montag 23:00). Ersetzen Sie "7 * 86400" durch "7 * 86400 + 7200". In diesem Fall ist die Zeit natürlich nicht immer 0:00, aber das Datum ist DST-sicher! – davil

+0

Sie haben Recht, das war eine Art Schnellschuss. Danke, dass du das unterstrichen hast! –

+0

danke dafür, ich habe es bis heute nicht bemerkt (heute mittwoch) T_T ich schulde dir mehr jetzt hehe – lock

13

PHP dies macht eigentlich ganz einfach:

echo strtotime('last Tuesday'); 

Siehe strtotime Dokumentation.

+0

TT, warum ich nicht, dass TT in der Dokumentation gesehen Dank viel ich Ihnen – lock

+1

schuldig eigentlich nicht geben Sie „Dienstag letzter Woche“, aber die letzte Dienstag (was die gleiche Woche sein kann ... wenn es Freitag ist) – garyee

+0

Genau @garyee - überprüfen Sie meine Antwort unter – smo0f

0

Sie haben strtotime für das zweite Argument des Datums vergessen ('W', $ Dienstag) hmm.

convert $ Dienstag vor "$ tuesday-7 * 86400 + 7200"

mde zu.

3

Arbeitslösung:

$z = date("Y-m-d", strtotime("last Saturday")); 
$z = (date('W', strtotime($z)) == date('W')) ? (strtotime($z)-7*86400+7200) : strtotime($z); 
print date("Y-m-d", $z); 
1
// test: find last date for each day of the week 
foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) { 
    print $day . " => " . date('m/d/Y', last_dayofweek($day)) . "\n"; 
} 

function last_dayofweek($day) 
{ 
    // return timestamp of last Monday...Friday 
    // will return today if today is the requested weekday 
    $day = strtolower(substr($day, 0, 3)); 
    if (strtolower(date('D')) == $day) 
     return strtotime("today"); 
    else 
     return strtotime("last {$day}"); 
} 
0
<?php 
    $currentDay = date('D'); 
    echo "Today-".$today = date("Y-m-d"); 
    echo "Yesterday-".$yesterday = date("Y-m-d",strtotime('yesterday')); 
    echo "Same day last week-".$same_day_last_week = date("Y-m-d",strtotime('last '.$currentDay)); 
?> 
13

Die meisten dieser Antworten sind entweder zu viel oder technisch nicht korrekt, weil „am vergangenen Dienstag“ bedeutet nicht unbedingt, der Dienstag der vergangenen Woche, es ist einfach bedeutet der vorherige Dienstag, der innerhalb derselben Woche von "jetzt" sein könnte.

Die richtige Antwort lautet:

strtotime('tuesday last week') 
+2

Das sollte die angenommene Antwort sein –

+0

@STTLCU yeah Ich weiß nicht, warum der am höchsten gestimmte als richtig gilt, wenn Sie es an einem Mittwoch ausführen, wird es im Grunde den gestrigen Dienstag, nicht zuletzt zurückkehren Woche, die nicht ist, was OP um – smo0f

+1

bittet, stimme ich @STT LCU zu. Dies sollte die akzeptierte Antwort sein, als ich auf das gleiche Problem gestoßen bin, das "letzten Montag" verwendete, der gestern aufnahm – AdRock