Подтвердить что ты не робот

Поиск следующих 13 понедельников и в последний понедельник

У меня есть следующий код, который возвращает следующие 13 понедельников с сегодняшнего дня.

for($i=1; $i<=13; $i++){
    echo date("Y-m-d", strtotime('+'.$i.' Monday'))."<br>";
}

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

Я пробовал изменить код следующим образом, но затем я получил два экземпляра следующего понедельника.

for($i=-1; $i<=13; $i++){
echo date("Y-m-d", strtotime('+'.$i.' Monday'))."<br>";
}

Возвращенные данные.

2015-04-13
2015-04-20  //<--
2015-04-20
2015-04-27
2015-05-04
2015-05-11
2015-05-18
2015-05-25
2015-06-01
2015-06-08
2015-06-15
2015-06-22
2015-06-29
2015-07-06
2015-07-13

Любые идеи о том, как я это достигаю?

4b9b3361

Ответ 1

Я бы сделал это следующим образом:

for($i =- 1; $i <= 13; $i == 0 ? $i += 2 : $i++){
    echo date("Y-m-d", strtotime("$i Monday")) . "<br>";
}

Использование тернарного оператора для проверки того, является ли $i равным 0, а если увеличить его на 2 вместо 1:)

Ответ 2

Попробуйте следующее:

echo date("Y-m-d", strtotime('-1 Monday'))."<br>";
for($i=1; $i<=13; $i++){
    echo date("Y-m-d", strtotime('+'.$i.' Monday'))."<br>";
}

Или вам нужен только один оператор for?

Ответ 3

function mondays() {
    $begin = new DateTime('last monday');
    $end = clone $begin;
    $end->add(new DateInterval('P14W')); // next 13 + last

    $interval = new DateInterval('P1W');
    $daterange = new DatePeriod($begin, $interval ,$end);

    foreach($daterange as $date){
        yield $date;
    }
}


foreach(mondays() as $date){
    echo $date->format("Y-m-d"), PHP_EOL;
}

Ответ 4

Вы можете использовать это:

for($i=-1; $i<=13; $i++){
    if($i !== 0){
        echo date("Y-m-d", strtotime('+'.$i.' Monday'))."<br>";        
    }
}

Вам просто нужно опустить случай, что $i равен нулю.

Ответ 5

Это должно работать (и вы можете проверить и другие дни!= сегодня)

//In order to avoid problems with midnight and daylight saving time
$refTime = date("Y-m-d 12:00:00");

for($i=-1; $i<13; $i++){
    echo date("Y-m-d", strtotime("$refTime this Monday +".$i*7 ." days"))."<br>";
}

Ответ 6

Мой подход будет следующим (с использованием класса DateTime)

$monday = new DateTime('last monday'); //if today is monday this will return last week's
$oneWeek = new DateInterval('P1W');
for($i=0; $i<=13; $i++){
    echo $monday->format('Y-m-d')."<br>";
    $monday->add($oneWeek);
}