2011-12-19 11 views
5

Tak więc, w PHP próbuję zwrócić wartość daty za ostatni rok w oparciu o ten sam dzień tygodnia. EX: (poniedziałek) 2011-12-19 wprowadzony powinien wrócić (poniedziałek) 2010-12-20.php - znajdź datę tego samego dnia tygodnia za ostatni rok

Po prostu robiłem to po prostu przez -364, ale to się nie udało w latach przestępnych. Natknąłem się na inną funkcję:

$newDate = $_POST['date']; 
$newDate = strtotime($newDate); 
$oldDate = strtotime('-1 year',$newDate); 

$newDayOfWeek = date('w',$oldDate); 
$oldDayOfWeek = date('w',$newDate); 
$dayDiff = $oldDayOfWeek-$newDayOfWeek; 

$oldDate = strtotime("$dayDiff days",$oldDate); 

echo 'LAST YEAR DAY OF WEEK DATE = ' . date('Ymd', $oldDate); 

jednak, że się niepowodzeniem podczas próby wejścia datę niedzielę, jak to robi się 0 (niedziela) minus 6 (sobota dzień ostatniego roku), i wraca z wartością T-6. Wpisanie IE 2011-12-25 spowoduje wyświetlenie 2010-12-19 zamiast 2011-12-26.

Jestem trochę zakłopotany, aby znaleźć dobre rozwiązanie w php, które będzie działać przez lata przestępne i oczywiście przez wszystkie dni tygodnia.

Wszelkie sugestie?

Dzięki!

Odpowiedz

8

Jak ten temat, używając PHP DateTime funkcjonalność:

$date = new DateTime('2011-12-25'); // make a new DateTime instance with the starting date 

$day = $date->format('l');   // get the name of the day we want 

$date->sub(new DateInterval('P1Y')); // go back a year 
$date->modify('next ' . $day);  // from this point, go to the next $day 
echo $date->format('Ymd'), "\n";  // ouput the date 
+1

To dobrze, ale co roku przestępnym? – Shea

+0

@andrewjackson Działa dobrze. "2012-12-25" oznacza "2011-12-27". – lonesomeday

2

Użyj strtotime(), aby uzyskać datę, w tym samym tygodniu, w ubiegłym roku.

użyć formatu {$ rok} -W {$ tydzień} - {$} dni tygodnia, tak:

echo date("Y-m-d", strtotime("2010-W12-1")); 

I można to zrobić tak długo z powrotem ty wa:

<?php 

    for($i = 2011; $i > 2000; $i--) 
    echo date("Y-m-d", strtotime($i."-W12-1")); 

?> 
4
$newDate = '2011-12-19'; 

date_default_timezone_set('UTC'); 
$newDate = strtotime($newDate); 
$oldDate = strtotime('last year', $newDate); 
$oldDate = strtotime(date('l', $newDate), $oldDate); 

$dateFormat = 'Y-m-d l w W'; 

echo "This date: ", date($dateFormat, $newDate), "\n"; 
echo "Old date : ", date($dateFormat, $oldDate); 

daje:

This date: 2011-12-19 Monday 1 51 
Old date : 2010-12-20 Monday 1 51 
2

Ułatw :)

echo date('Y-m-d (l, W)').<br/>; 
echo date('Y-m-d (l, W)', strtotime("-52 week")); 

Edit: Zapomniałem napisać wyjście: :) ​​

2015-05-06 (Wednesday, 19) 
2014-05-07 (Wednesday, 19) 
Powiązane problemy