2016-08-16 2 views
0

, прося о функции Date в php Я хочу, чтобы диапазон дат в неделю (понедельник-суббота), чтобы дата соответствовала сегодняшней дате в раскрывающемся списке. Скажем сегодня 16 августа, диапазон начнется в 15 августа - 20 августа, 22 августа - 27, 29 августа - 3 сентября и так далее.Дата окончания, равная сегодняшней дате

Я использую этот синтаксис

<?php 
    for ($i = 0; $i < 8; $i++) { 
    echo '<option value="'.date("Ymd", strtotime("$i weeks monday")).'">'.date("d F", strtotime("$i weeks monday"))." - ".date("d F", strtotime("$i weeks saturday")).'</option>'; 
    } 
    } 
?> 

Он отлично работает только в понедельник, но на следующий день, когда я открываю в Интернете, это показывает, на следующей неделе в понедельник для всех вариант. Похоже, что когда понедельник прошло, этот понедельник вышел из списка на этой неделе, а в следующий понедельник - в эти недели в понедельник. Это ошибка с strtotime или есть лучший синтаксис strtotime для использования? Если возможно, я хочу избежать использования, если проверять дату, но если нет, то есть ли какой-либо простой синтаксис для использования в strtotime?

ответ

0

Это сложно сделать с strtotime() и вдвойне, как с одним вкладышем. Использование DateTime() and it's related classes позволяет сделать это проще простого.

$start = new DateTimeImmutable('Monday this week'); 
$end  = $start->add(new DateInterval('P8W')); 
$interval = new DateInterval('P1W'); 
$period = new DatePeriod($start, $interval, $end); 
foreach ($period as $week) { 
    $monday = $week->format('Ymd'); 
    $saturday = $week->modify('next Saturday')->format('Ymd'); 

    printf('<option value="%s">%s - %s</option>', $monday, $monday, $saturday); 
} 

Demo

Что происходит здесь:

  1. Используйте DateTimeImmutable(), чтобы создать нашу начальную дату, которая является понедельник текущей недели
  2. Установите нашу конечную дату составляет 8 недель от теперь (с использованием DateInterval())
  3. Установите интервал для нашего цикла как недельный период
  4. Положите все это в DatePeriod() объект, который мы можем перебирать
  5. Получить формат для нашей даты
  6. понедельника Получить формат для нашей даты субботы
  7. Echo это в качестве <option> тега (используя printf() так более читаемым в нашем коде)
+0

Что такое P1w/P8W означает Interval? Никогда не используйте DateTimeImmutable() до –

+0

'P1W ~ означает« Период 1 Неделя ». Оттуда вы можете догадаться, что означает «P8W». :) 'DateTimeImmutable()' точно так же, как 'DateTime()', но всегда возвращает новый объект вместо изменения исходного. В зависимости от того, что вы делаете, не имеет значения, какой из них вы используете. –

+0

Я пробовал, и это работает, спасибо человеку. надеюсь, что это не сломано, если день изменится. Когда я использую strtotime («Понедельник на этой неделе»), результат, как я описываю ранее. Но когда в вашем коде он работает, даже строка точно такая же? Вы знаете об этом? –

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

  • Нет связанных вопросов^_^