PHP: получить следующие 13 дат с даты?

Я пытаюсь получить массив даты плюс следующие 13 дат, чтобы получить 14-дневное расписание, начиная с заданной даты.

вот моя функция:

$time = strtotime($s_row['schedule_start_date']); // 20091030
$day = 60*60*24;
for($i = 0; $i<14; $i++)
{
    $the_time = $time+($day*$i);
    $date = date('Y-m-d',$the_time);
    array_push($dates,$date);
}

Но, похоже, повторяется дата, когда месяц переключается..

вот что я получаю:

2009-10-30|2009-10-31|2009-11-01|2009-11-01|2009-11-02|2009-11-03|2009-11-04|2009-11-05|2009-11-06|2009-11-07|2009-11-08|2009-11-09|2009-11-10|2009-11-11

Обратите внимание, что 2009-11-01 повторяется. Я не могу понять, почему?

Что я делаю неправильно?

Спасибо!!


person JD Isaacks    schedule 28.10.2009    source источник


Ответы (3)


я бы использовал strtotime

$start = strtotime($s_row['schedule_start_date']);
$dates=array();
for($i = 1; $i<=14; $i++)
{
    array_push($dates,date('Y-m-d', strtotime("+$i day", $start)));
}
print_r($dates);
person Galen    schedule 28.10.2009

У вас та же дата из-за перехода на летнее время. Небезопасно добавлять 24*60*60 секунды, чтобы найти следующий день, потому что 2 дня в году содержат больше/меньше секунд. При переходе с летнего времени на зимнее вы добавляете 1 час к суткам. Так что в этот день будет 25*60*60 секунды, поэтому в вашем коде это не переключено.

Вы можете выполнить расчет с помощью mktime(). Например:

## calculate seconds from epoch start for tomorrow
$tomorrow_epoch = mktime(0, 0, 0, date("m"), date("d")+1, date("Y"));
## format result in the way you need
$tomorrow_date = date("M-d-Y", $tomorrow_epoch);

Или полная версия для вашего кода:

$dates = array();
$now_year = date("Y");
$now_month = date("m");
$now_day = date("d");
for($i = 0; $i < 14; $i++) {
    $next_day_epoch = mktime(0, 0, 0, $now_month, $now_day + $i, $now_year);
    array_push(
        $dates,
        date("Y-m-d", $next_day_epoch)
    );
}
person Ivan Nevostruev    schedule 28.10.2009
comment
Это делает с тех пор, так что я должен делать вместо этого? Спасибо. - person JD Isaacks; 28.10.2009

Я рекомендую что-то вроде:

for($i=1;$i<=14;$i++){
     echo("$i day(s) away: ".date("m/d/Y",strtotime("+$i days")));
}
person Ben Reisner    schedule 28.10.2009