Как я могу повторить все даты в понедельник / среду / пятницу между этими двумя датами?
Это то, с чем я работал:
function get_days ( $s, $e ) { $r = array (); $s = strtotime ( $s . ' GMT' ); $e = strtotime ( $e . ' GMT' ); $day = gmdate ( 'l', $s ); do { $r[] = $day . ', ' . gmdate ( 'Ym-d', $s ); $s += 86400 * 7; } while ( $s <= $e ); return $r; } print_r ( get_days ( $start, $end ) );
Попробуй это:
function getDates($start_date, $end_date, $days){ // parse the $start_date and $end_date string values $stime=new DateTime($start_date); $etime=new DateTime($end_date); // make a copy so we can increment by day $ctime = clone $stime; $results = array(); while( $ctime <= $etime ){ $dow=$ctime->format("w"); // assumes $days is array containing integers for Sun (0) - Sat (6) if( in_array($dow, $days) ){ // make a copy to return in results $results[]=clone $ctime; } // incrememnt by 1 day //$ctime=date_add($ctime, date_interval_create_from_date_string('1 days')); $ctime->modify("+1 days"); } return $results; } // get every Tues, Wed, Fri from now to End of June getDates('2011-06-15','2011-06-30',array(2,3,5));
Вы должны иметь возможность получать дни, используя strtotime()
. Он принимает аргументы как next Tuesday
а также анализирует 2011-06-15
в правильную временную метку. И да, вам нужен один (или более) цикл (ы).
Этого должно быть достаточно, чтобы указать вам в правильном направлении.
Хорошо, вы обновили свой вопрос, пока я писал свой ответ. Вы не можете предположить, что день всегда имеет 86400 секунд. Когда DST начинается или заканчивается, ваше предположение будет неправильным.
<?php $start = "1 Jan 2011"; $end = "20 Jan 2011"; $dates = getDays($start, $end); print_r($dates); function getDays($start,$end) { $t = new DateTime("$start 12:00"); $e = new DateTime($end ." 12:00"); $out = array(); for (; $t<=$e; $t->modify("+1 day")) { $day = $t->format("D"); if (in_array($day, array('Mon','Wed','Fri'))) { $out[] = $t->format('d M Y'); } } return $out; }