Найти вторую и четвертую субботу месяца

как найти 2-ю и 4-ю субботу месяца. Я написал такие строки:--6-->

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'));

Он дает следующий вывод : -

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

Он дает правильный ответ в may месяц, а не june 2013, в jun 1013 2-я и 4-я суббота должны быть 8 и 22 соответственно. Как я мог решить эту проблему.

5 ответов


Я не уверен, почему ваш не будет работать, но попробуйте это, это сработало для меня:

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'));

Он основан на "first sat of July 2008" пример PHP руководство страница


Я не знаю, почему это вызывает эту ошибку, однако я нашел решение, как получить правильные ответы

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>';

такое решение отлично работает и показывает правильные результаты.

выход:

11
25
08
22

тогда вы должны запускать версию PHP ниже версии 5.2.7, как руководство государства

в PHP 5 до 5.2.7 запрос заданного события заданного дня недели в месяце, где этот день недели был первым днем месяца, неправильно добавит одну неделю к возвращаемой метке времени. Это было исправлено в 5.2.7 и более поздних версий.

поэтому, если вы можете обновить свою версию PHP, это будет лучшим решением. Еще вы можете проверить что-то вроде.

<?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);
?>

Я обычно не полагаюсь на кусок строки. Как насчет выполненной на заказ функции?

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

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

и используйте его в своем контексте

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);

в эти дни мой предпочтительный метод-расширить PHP объект DateTime: -__

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');

выход:-

2011-07-10