PHP пропустить первую неделю при расчете первой / второй / третьей среды

0

Я пишу сценарий, где он будет заполнять серию дат, основанную на критериях, установленных между временем начала и окончания.

В основном я использую относительные форматы в функции php date (http://php.net/manual/en/datetime.formats.relative.php).

Мой скрипт сначала получает интервалы, основанные на выборе пользователя:

//first get the interval
$event_repeatmonth = $_POST['event_repeatmonth'];   
if ($event_repeatmonth == 1){ $interval = 'first';}
if ($event_repeatmonth == 2){ $interval = 'second';}
if ($event_repeatmonth == 3){ $interval = 'third';}
if ($event_repeatmonth == 4){ $interval = 'fourth';}
if ($event_repeatmonth == 5){ $interval = 'fifth';}
if ($event_repeatmonth == 6){ $interval = 'last';}

$onthe_monday = $_POST['onthe_monday'];
$onthe_tuesday = $_POST['onthe_tuesday'];
$onthe_wednesday = $_POST['onthe_wednesday'];
$onthe_thursday = $_POST['onthe_thursday'];
$onthe_friday = $_POST['onthe_friday'];
$onthe_saturday = $_POST['onthe_saturday'];
$onthe_sunday = $_POST['onthe_sunday'];

if ($onthe_monday == 1){ $interval_period[] = $interval." Monday";}                         
if ($onthe_tuesday == 1){ $interval_period[] = $interval." Tuesday";}               
if ($onthe_wednesday == 1){ $interval_period[] = $interval." Wednesday";}               
if ($onthe_thursday == 1){ $interval_period[] = $interval. " Thursday";}                
if ($onthe_friday == 1){ $interval_period[] = $interval. " Friday";}                
if ($onthe_saturday == 1){ $interval_period[] = $interval. " Saturday";}                
if ($onthe_sunday == 1){ $interval_period[] = $interval. " Sunday";}

Затем он будет проходить через даты в начале и в конце даты. Он возьмет первую дату месяца в качестве контрольной даты и найдет соответствующий 1-й /2-й /3-й понедельник/вторник... месяца:

//loop through to insert the array
while ($tmp <= $event_udate){
    $tmpmonth = date("Y-m", strtotime($tmp))."-01";

    //get proper date based on the intervals we are looking for
    foreach ($interval_period  AS $period){
        $tmp = date("Y-m-d", strtotime($period, strtotime($tmpmonth)));
        echo $period."--".$tmp."--".$tmpmonth."<br/>";
        //sometimes the first interval will be before the start date, skip that
        if ($tmp >= $event_sdate){
            $event_datearray[] = $tmp;
        }                       
    }                   
    //reset if reach end of the month
    if ($repeat_every > 1){ 
        //go to next month      
        $tmp = date('Y-m-d', strtotime('+'. $repeat_every.' month',  strtotime($tmp)));                     
    }else{                              
        //go to next month      
        $tmp = date('Y-m-d', strtotime('+1 month', strtotime($tmp)));               
    }           
}   

Например, здесь я попросил программу получить вторую среду и второе воскресенье месяца на каждые 3 месяца между временными рамками от 4/1/2015 до 8/30/2015.

Результат должен был возвратиться: 4/8, 4/12, 7/8 и 7/12. Однако, похоже, что с 4/1 и 7/1 в среду он пропустил первую неделю и вместо этого занял третью среду.

Мой результат эха выглядит как внизу, как вы можете видеть, он схватил 4/15 в качестве второй среды 2015-04-01.... и схватил 7/15 в качестве второй среды 2015-07-01...

second Wednesday--2015-04-15--2015-04-01
second Sunday--2015-04-12--2015-04-01
second Wednesday--2015-07-15--2015-07-01
second Sunday--2015-07-12--2015-07-01
array(4) { [0]=> string(10) "2015-04-15" [1]=> string(10) "2015-04-12" [2]=> string(10) "2015-07-15" [3]=> string(10) "2015-07-12" }

Я здесь довольно утерян. Это кажется проблемой только тогда, когда первый месяц соответствует одному из критериев. Если я изменю его на 2-й четверг и 2-е воскресенье, тогда он вернется правильно:

second Thursday--2015-04-09--2015-04-01
second Sunday--2015-04-12--2015-04-01
second Thursday--2015-07-09--2015-07-01
second Sunday--2015-07-12--2015-07-01
array(4) { [0]=> string(10) "2015-04-09" [1]=> string(10) "2015-04-12" [2]=> string(10) "2015-07-09" [3]=> string(10) "2015-07-12" }

Кто-нибудь имеет такую же проблему раньше???

Теги:
date

1 ответ

0

Я понял это после того, как я разместил его...

Оказывается, относительный формат в дате PHP не включает дату, на которую он ссылается. Например, если вы ищете второй понедельник 2015-04-01, он будет искать первый экземпляр второго понедельника после 2015-04-01...

Поэтому, чтобы исправить это, я просто проверяю, соответствует ли первый из месяцев критериям, которые я ищу, если это так, а затем измените мой контрольный день на день раньше, чтобы он учитывал исходную дату.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню