2013-05-22 25 views
2

У меня есть календарь, который я хочу, чтобы события повторялись в течение недельного дня месяца. Некоторые примеры были бы:Сколько определенного дня недели прошло в этом месяце

  • Повторите каждый четвёртый вторник месяца
  • Повторите каждую вторую пятницу месяца
  • И так далее ...

Что мне нужно, это способность узнать, сколько недельных дней (например, вторника) прошло в этом месяце.

I found some code, который возвращает количество понедельника.

$now=time() + 86400; 
if (($dow = date('w', $now)) == 0) $dow = 7; 
$begin = $now - (86400 * ($dow-1)); 

echo "Mondays: ".ceil(date('d', $begin)/7)."<br/>"; 

Это хорошо работает, но как я могу это сделать, чтобы определить день недели? Похоже, я не могу обойти этот код, чтобы сделать эту работу.

+1

Я бы просто найти первое вхождение будний вам нужно [ путем циклирования с первого месяца, до 7-го в худшем случае], просто добавьте '7 * (n-1)' days, чтобы узнать «n-th». – moonwave99

+0

«Кажется, я не могу придумать код, чтобы сделать эту работу». --- Это потому, что тривиальный код должен быть написан с нуля. – zerkms

+2

Отъезд [этот ответ] (http://stackoverflow.com/a/5381021/642196). –

ответ

1

strtotime действительно полезен для такого рода вещей. Here are lists of the supported syntax. Использование пример повторения каждый второй пятницу месяца я написал следующий простой фрагмент кода для вас:

<?php 
    $noOfMonthsFromNow=12; 
    $dayCondition="Second Friday of"; 

    $months = array(); 
    $years = array(); 
    $currentMonth = (int)date('m'); 
    for($i = $currentMonth; $i < $currentMonth+$noOfMonthsFromNow; $i++) { 
     $months[] = date('F', mktime(0, 0, 0, $i, 1)); 
     $years[] = date('Y', mktime(0, 0, 0, $i, 1)); 
    } 
    for ($i=0;$i<count($months);$i++){ 
     $d = date_create($dayCondition.' '.$months[$i].' '.$years[$i]); 
     if($d instanceof DateTime) echo $d->format('l F d Y H:i:s').'<br>'; 
    } 
?> 

Это можно проверить по адресу: http://www.phpfiddle.org/lite/

+0

Да, это то, что мне нужно. [Этот ответ] (http://stackoverflow.com/questions/5380410/repeating-events-on-the-nth-weekday-of-every-month/5381021#5381021) также был полезен. Спасибо за вашу помощь! –

0
$beginningOfMonth = strtotime(date('Y-m-01')); // this will give you the timestamp of the beginning of the month 
$numTuesdaysPassed = 0; 
for ($i = 0; $i <= date('d'); $i ++) { // 'd' == current day of month might need to change to = from <= depending on your needs 
    if (date('w', $beginningOfMonth + 3600 * $i) == 2) $numTuesdaysPassed ++; // 3600 being seconds in a day, 2 being tuesday from the 'w' (sunday == 0) 
} 

Не уверен, что это сработает, и, вероятно, лучший способ это сделать; у меня нет средств проверить его прямо сейчас, но, надеюсь, это ставит вас на правильный путь! (Я тоже немного сработал на математике по дате, особенно с часовыми поясами)

Смежные вопросы