2013-05-18 1 views
3

Мне нужно получить следующие 7 (или более) дат, кроме воскресенья. Во-первых, я сделал это, какКак повторить день в php?

$end_date = new DateTime(); 
$end_date->add(new DateInterval('P7D')); 

$period = new DatePeriod(
    new DateTime(), 
    new DateInterval('P1D'), 
    $end_date 
); 

И после того, как проверил $period в foreach. Но потом я заметил, что если я удалю воскресенье, мне нужно добавить еще один день до конца, и это каждый раз, когда воскресенье ... Есть ли способ сделать это?

+0

Воскресенье не всегда в вашем списке из 7 дней? Разве вам не нужно добавлять еще один день каждый раз? – Dchris

+0

@Dchris новая дата начинается с этого момента и может составлять 7 дней или более (например, 14 дней), поэтому мне нужно удалить каждое воскресенье с этого периода и добавить один дополнительный день. – Kin

ответ

4
$start = new DateTime(''); 
$end = new DateTime('+7 days'); 
$interval = new DateInterval('P1D'); 
$period = new DatePeriod($start, $interval, $end); 

foreach ($period as $dt) { 
    if ($dt->format("N") === 7) { 
     $end->add(new DateInterval('P1D')); 
    } 
    else { 
     echo $dt->format("l Y-m-d") . PHP_EOL; 
    } 
} 

See it in action

+0

, как я уже сказал, если '$ dt' - воскресенье, мне нужно добавить дополнительный день в $ period; – Kin

+0

Обновлено accordinly –

+0

Если бы я знал, как добавить, я бы не стал задавать этот вопрос. – Kin

0

Вы можете попробовать использовать UNIX time, добавив день, а если день - воскресенье, добавьте еще один. Первый день вашего списка будет, например. сегодня в 12:00. Чем вы добавляете 24 * 60 * 60 для получения следующего дня и так далее. Преобразование UNIX в день простое, используйте функцию date().

$actDay = time(); 
$daysCount = 0; 
while(true) 
{ 
    if (date("D", $actDay) != "Sun") 
    { 
    //do something with day 
    $daysCount++; 
    } 

    if ($daysCount >= LIMIT) break; 

    $actDay += 24 * 60 * 60; 
} 
+0

Пожалуйста, когда кто-то перешел за рамки оснований к использованию DateTime, DateInterval и DatePeriod, НЕ предлагайте, чтобы они вернулись к использованию функций даты на основе даты unix –

0

Вы не можете удалять дней с DatePeriod, но вы можете просто сохранить счетчик не-воскресенье и держать итерации, пока не накоплено 7 из них:

$date = new DateTime(); 

for ($days = 0; $days < 7; $date->modify('+1 day')) { 
    if ($date->format('w') == 0) { 
     // it's a Sunday, skip it 
     continue; 
    } 

    ++$days; 
    echo $date->format('Y-m-d')."\n"; 
} 
1

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

$days_wanted = 7; 

$base_period = new DatePeriod(
    new DateTime(), 
    new DateInterval('P1D'), 
    ceil($days_wanted * (8/7)) // Enough recurrences to exclude Sundays 
); 

// PHP >= 5.4.0 (lower versions can have their own FilterIterator here) 
$no_sundays = new CallbackFilterIterator(
    new IteratorIterator($base_period), 
    function ($date) { 
     return $date->format('D') !== 'Sun'; 
    } 
); 

$period_without_sundays = new LimitIterator($no_sundays, 0, $days_wanted); 

foreach ($period_without_sundays as $day) { 
    echo $day->format('D Y-m-d') . PHP_EOL; 
} 
Смежные вопросы