2013-06-11 2 views
7

So finden Sie den 2. und 4. Samstag des Monats. schrieb ich diese Zeilen: -Finden Sie den zweiten und vierten Samstag des Monats

echo "may 2nd sat ".date('d', strtotime('may 2013 second saturday')); 
echo '<br/>may 4th sat '.date('d', strtotime('may 2013 fourth saturday'));         
echo '<br/>june 2nd sat '.date('d', strtotime('june 2013 second saturday')); 
echo '<br/>june 4th sat '.date('d', strtotime('june 2013 fourth saturday')); 

Es gibt die folgende Ausgabe: -

may 2nd sat 11 
may 4th sat 25 
june 2nd sat 15 
june 4th sat 29 

Es richtige Antwort in may Monate gibt aber nicht june 2013, in jun 1013 2. und 4. Samstag 8 sein sollte, und 22 beziehungsweise. Wie kann ich dieses Problem lösen?

Antwort

7

Ich bin mir nicht sicher, warum Ihr nicht funktionieren, sondern versuchen, das, es für mich gearbeitet:

echo '<br/>june 2nd sat '.date('d', strtotime('second sat of june 2013')); 
echo '<br/>june 4th sat '.date('d', strtotime('fourth sat of june 2013')); 

Es basiert auf dem "first sat of July 2008" Beispiel in den PHP manual page

+0

Der obige Link mir nicht funktioniert. Benutze stattdessen dieses: http://ca1.php.net/manual/en/datetime.formats.relative.php – Stan

+0

Danke, ich habe den Link aktualisiert – periklis

1

In diesen Tagen meine bevorzugte Methode ist PHP DateTime object zu erweitern: -__

class MyDateTime extends DateTime 
{ 
    /** 
    * Returns a MyDateTime object set to 00:00 hours on the nth occurence 
    * of a given day of the month 
    * 
    * @param string $n nth day required, eg first, second etc 
    * @param string $day Name of day 
    * @param mixed $month Month number or name optional defaults to current month 
    * @param mixed $year optional defaults to current year 
    * 
    * @return MyDateTime set to last day of month 
    */ 
    public function nthDayOfMonth($n, $day, $month = null, $year = null) 
    { 
     $timestr = "$n $day"; 
     if(!$month) $month = $this->format('M'); 
     $timestr .= " of $month $year"; 
     $this->setTimestamp(strtotime($timestr)); 
     $this->setTime(0, 0, 0); 
     return $this; 
    } 
} 
$dateTime = new MyDateTime(); 
echo $dateTime->nthDayOfMonth('second', 'Sun', 'Jul', 2011)->format('Y-m-d'); 

Ausgang: -

2011-07-10 
4

Ich weiß nicht, warum es diesen Fehler verursacht howver ich gefunden habe Lösung, wie die richtigen Antworten bekommen

echo date('d',strtotime('+1 week sat may 2013')).'<BR>'; 
echo date('d',strtotime('+3 week sat may 2013')).'<BR>'; 
echo date('d',strtotime('+1 week sat june 2013')).'<BR>'; 
echo date('d',strtotime('+3 week sat june 2013')).'<BR>'; 

Diese Lösung funktioniert gut und zeigt gute Ergebnisse zu erzielen.

Ausgang:

11 
25 
08 
22 
1

Dann müssen Sie eine PHP-Version unter Version 5.2.7, als manual states

In PHP 5 vor 5.2.7 ausgeführt werden, einen gegebenen anfordernden Das Auftreten eines bestimmten Wochentags in einem Monat, in dem dieser Wochentag der erste Tag des Monats war, würde dem zurückgegebenen Zeitstempel fälschlicherweise eine Woche hinzufügen. Dies wurde in 5.2.7 und späteren Versionen korrigiert.

Also, wenn Sie Ihre PHP-Version aktualisieren können, wäre das die beste Lösung. Sonst können Sie etwas wie überprüfen.

<?php 
function showDay($month, $year, $day, $count) 
{ 
    $list = array(1=>'first',2=>'second',3=>'third',4=>'fourth',5=>'fifth'); 
    $first = date('d', strtotime($month . ' ' . $year . ' ' . $list[1] .' '.$day)); 
    $show= ($first>7) ? $count-1 : $count; 
    return date('d', strtotime($month . ' ' . $year . ' ' . $list[$show] .' '.$day)); 
} 

echo '<br/>june 2nd sat '.showDay('june', 2013, 'saturday', 2); 
?> 
+0

Das OP ist als 'php-5.4' markiert. Aber es ist sowieso nützliche Information, gut zu wissen – periklis

1

Ich verlasse mich normalerweise nicht auf ein Stück Schnur. Wie wäre es mit einer benutzerdefinierten Funktion?

function getSaturdayDay($year, $month, $position) { 
    $firstDay = date('w', mktime(0, 0, 0, $month, 1, $year)); 
    $diff = 6 - $firstDay; 

    return 1 + $diff + $position * 7; 
} 

und verwenden Sie es in Ihrem Kontext

echo "may 2nd sat " . getSaturdayDay(2013, 5, 1); 
echo '<br/>may 4th sat ' . getSaturdayDay(2013, 5, 3);       
echo '<br/>june 2nd sat ' . getSaturdayDay(2013, 6, 1); 
echo '<br/>june 4th sat ' . getSaturdayDay(2013, 6, 3); 
+0

die zuverlässigste Antwort bei weitem – user3338098