2009-02-13 14 views
5

Trochę utknąłem o tym, jak to zrobić. Biorąc pod uwagę obecny miesiąc, muszę zwrócić datę czwartej soboty każdego miesiąca.Wypracować datę czwartej soboty w bieżącym miesiącu

np. W tym miesiącu będzie 20 lutego, a następnie 27 marca.

Dzięki

+0

Nawiasem mówiąc, będzie to 28. zarówno w lutym, jak i w marcu. – kmkaplan

+0

Nie tak przypadkowo, biorąc pod uwagę, że luty ma 28 dni podzielnych przez 7. Oczywiście nie ma lat przestępnych. –

Odpowiedz

7

nie jestem programista PHP, jednak wydaje strtotime co jesteś po.

Możesz użyć strtotime ("czwarta sobota"), a to spowoduje powrót do czwartej soboty.

Zapoznaj się z dokumentami strtotime.

EDIT:

Wystarczy, aby odpowiedź pełna, dzięki Tom i Paul Dixon

date('dS F',strtotime('Fourth Saturday '.date('F o'))); 
+0

Zgodnie z linkiem, nic nie wskazuje na to, że" czwarta sobota "będzie dokładnie analizowana – Elie

+0

To działa ale sprawdziłem źródło PHP dla wyjaśnienia, ale jest to czytelny parser generowany yacc Zmieniono moją odpowiedź na to. –

+0

Tak, to działa, możesz zrobić coś podobnego do daty ("dS F", strtotime ("Czwarta sobota" .date ("F o")))) i działa jak poczęstunek – Tom

2

Znajdź pierwszą sobotę miesiąca, a następnie dodać trzy tygodnie temu.

Jeśli nie wiesz, kiedy jest pierwsza sobota (lub raczej nie znasz konkretnej daty odpowiadającej nazwie dnia), możesz spojrzeć na numer Doomsday algorithm, na który wygodnie spojrzałem post z nieco podobnym problemem.

3

Najwcześniejsza data czwartej soboty to 22 dzień miesiąca. Spójrz więc na 22-sze, zobacz jaki jest dzień tygodnia, jeśli to nie jest sobota, dodaj jeden dzień do daty i sprawdź ponownie, aż znajdziesz mecz (maksimum, które musisz sprawdzić to 6 dni).

-1

w PHP zamiast pseudo kod (myślę wymaga 5.2)

$date = getdate(); 
$date-> setDate($date->format('Y'), $date->format('Y'), '1'); // 1st of month. 
while ($date->format('w' != 6) 
    $date->modify("+1 day"); 
$date->modify("+21 day"); // date is now on the fourth saturday 
+0

Dlaczego to zostało odrzucone? Powinno to być "! = Sobota", a nie "!= Niedziela ", ale proces wygląda poprawnie ... –

+0

Całkowicie przegapiłem rzecz Sat/Sun, tah – ShuggyCoUk

7

Można użyć strtotime znaleźć "w najbliższą sobotę" na podstawie daty rozpoczęcia. Jeśli data początkowa wynosi na dzień przed najwcześniejszym poprzedniego dnia (21) otrzymujemy odpowiedź ...

//required year/month 
$yyyymm="2009-01"; 

//find next saturday after earliest possible date 
$t=strtotime("next saturday", strtotime("{$yyyymm}-21")); 

//here you go! 
echo "4th saturday of $yyyymm is ".strftime("%Y-%m-%d",$t)."\n"; 

Najwcześniejsza możliwa 4-ty powtórzenie dzień w każdym miesiącu jest 22. (1,8,15, 22), ostatnie 4 powtórzenie to 28 (7,14,21,28).

EDIT: Mimo, że nie jest jasne, w dokumentacji, można zwrócić się do „czwartą sobotę” zbyt - stosować zerowego dzień miesiąca jako podstawa:

$t=strtotime("fourth saturday", strtotime("{$yyyymm}-00")); 

lub pominięcie czasu pracy i podać miesiąc i rok bezpośrednio:

$t=strtotime("fourth saturday feb 2009"); 

czubek kapelusza Robin „nie jestem programista PHP” Dzień na plamienie, że :)

+0

Twoje rozwiązanie jest poprawne, ale w twoim drugim zdaniu myślę, że masz na myśli "... ostatni możliwy 3. piątek (21) ...". :-) –

+0

może być sformułowane lepiej tak, będzie modyfikować –

0
function fourth_saturday($year, $month) 
{ 
    $info = localtime(mktime(0, 0, 0, $month , 1, $year)); 
    return 28 - $info[6]; 
} 
Powiązane problemy