У меня есть время начала и окончания в формате 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("Ymd H:i:s", $slot) . '<br/>'; }
Это самый эффективный способ сделать это или есть лучший, более универсальный способ сделать это?
Иногда, когда вы пытались использовать другие цифры для разных временных интервалов, произошла фатальная ошибка: допустимый размер памяти исчерпан, что заставляет меня думать, что это не очень эффективно. Хотя, похоже, это не происходит сейчас …
(Я строю систему бронирования)
Ты пробовал
while ($t1 < $t2) { $t1 = strtotime('+1 hour', $t1); $timeslots[] = date('Ymd H:i:s', $t1); } foreach ( $timeslots as $slot ) { echo $slot . '<br/>'; }
Совсем так же, но чище. И как было сказано, strtotime будет обрабатывать изменения даты, например, високосные годы. Каков ваш лимит памяти PHP? Может быть слишком мало.
Скорее, чем
$t1 = $t1 + 3600;
Вам будет лучше с
$t1 = strtotime('+1 hour', $t1);
Последний настроится на летнее время, високосные годы и т. Д.
В противном случае ваш код выглядит отлично. Если у вас закончилась память, это, вероятно, было связано с бесконечным циклом. Вероятно, вы захотите добавить код, чтобы убедиться, что $ t2 больше, чем $ t1, и переключать их, если они не являются.
используя php 5.3
$dateTimes = new DatePeriod( new DateTime($start), new DateInterval('PT1H'), new DateTime($end) ); foreach ($dateTimes as $dt) { echo $dt->format('Ymd H:i:s'), "\n"; }