2015-03-06 4 views
0

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

В основном я использую относительные форматы в функции даты php (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-е воскресенье, то он вернется должным образом:

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" } 

Есть ли у кого-то такая же проблема до ???

ответ

0

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

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

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

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