3

我有一个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/>';
}

这是最有效的方法,还是有更好、更通用的方法?

有时在尝试使用其他数字以获得不同长度的时隙时会出现致命错误:允许的内存大小已耗尽,这让我认为它不是很有效。虽然现在似乎没有发生...

(我正在建立一个预订系统)

4

3 回答 3

6

你有没有尝试过

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 内存限制是多少?可能太低了。

于 2010-03-23T14:06:22.017 回答
0

而不是

$t1 = $t1 + 3600;

你会过得更好

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

后者将适应夏令时、闰年等。

否则,您的代码看起来不错。如果您的内存不足,则可能是由于无限循环。您可能想要添加代码以确保 $t2 大于 $t1,如果不是,则切换它们。

于 2010-03-23T14:13:24.407 回答
0

使用 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";
}
于 2010-03-23T16:44:05.077 回答