Время начала и окончания, разделенное на сегменты по 1 часу - PullRequest
2 голосов
/ 23 марта 2010

У меня есть время начала и окончания в формате timestamp. Я хочу разбить их на временные интервалы, например, 1 час.

$t1 = strtotime('2010-05-06 12:00:00');
$t2 = strtotime('2010-05-06 18:00:00');

$timeslots = array();

while ($t1 < $t2) {
$t1 = $t1 + 3600;
$timeslots[] = $t1;
}

foreach ( $timeslots as $slot ) {
echo date("Y-m-d H:i:s", $slot) . '<br/>';
}

Это самый эффективный способ сделать это или есть лучший, более универсальный способ сделать это?

Иногда при попытке использовать его с другими числами для разных временных интервалов длины возникала фатальная ошибка: допустимый объем памяти исчерпан, что заставляет меня думать, что это не очень эффективно. Хотя, похоже, сейчас этого не происходит ...

(я строю систему бронирования)

Ответы [ 3 ]

6 голосов
/ 23 марта 2010

Вы пробовали

while ($t1 < $t2) {
   $t1 = strtotime('+1 hour', $t1);
   $timeslots[] = date('Y-m-d H:i:s', $t1);
}

foreach ( $timeslots as $slot ) {
   echo $slot . '<br/>';
}

Примерно то же самое, но чище. И, как было сказано, strtotime будет обрабатывать изменения даты, такие как високосные годы. Какой у вас установлен предел памяти PHP? Может быть слишком низко.

0 голосов
/ 23 марта 2010

с использованием php 5.3

$dateTimes = new DatePeriod(
    new DateTime($start),
    new DateInterval('PT1H'),
    new DateTime($end)
);

foreach ($dateTimes as $dt) {
    echo $dt->format('Y-m-d H:i:s'), "\n";
}
0 голосов
/ 23 марта 2010

Вместо

$t1 = $t1 + 3600;

Вам будет лучше с

$t1 = strtotime('+1 hour', $t1);

Последний будет настраиваться на летнее время, високосные годы и т. Д.

В противном случае ваш код выглядит нормально. Если вам не хватило памяти, это, вероятно, было связано с бесконечным циклом. Возможно, вы захотите добавить код, чтобы убедиться, что $ t2 больше, чем $ t1, и переключать их, если это не так.

...