PHP显示两个日期范围之间的时间

时间:2014-06-19 22:25:39

标签: php

我目前正在摆弄这个我修改为的PHP代码:

$begin = new DateTime('2010-01-01 08:00');
$end = new DateTime( '2010-05-01 20:00');

$interval = DateInterval::createFromDateString('15 min');
$period = new DatePeriod($begin, $interval, $end);

foreach ( $period as $dt ) {
  echo $dt->format( "Y-d-m H:i" ) . '<br/>';
}

这回声:

2010-01-01 08:00
2010-01-01 08:15
2010-01-01 08:30
2010-01-01 08:45
2010-01-01 09:00
.....
2010-01-05 01:00
2010-01-05 01:15
2010-01-05 01:30
.....
2010-01-05 19:15
2010-01-05 19:30
2010-01-05 19:45

在上面的代码中我只希望将时间放在上午8点到晚上8点之间。在晚上8点到8点之间的任何时间都不会显示shouddn。我基本上知道我做错了什么,即显示日期范围,但我想知道如何解决它。

2 个答案:

答案 0 :(得分:0)

如果由于某些原因确实需要显示确切的变量而不进行过滤,则可以使用2 DatePeriod:

<?php
$begin = new DateTime('2010-01-01 08:00');
$end = new DateTime( '2010-05-01 20:00');

$interval = new DateInterval('P1D');
$period = new DatePeriod($begin, $interval, $end);

foreach ( $period as $dt ) {
  $tempBegin = $dt;
  $tempEnd = clone $dt;
  $tempEnd->add(new DateInterval('PT12H1M')); //remove '1M' if you just need value 08.00 - 19.45
  if($tempEnd > $end)
    $tempEnd = $end;

  $tempInterval = new DateInterval('PT15M');
  $tempPeriod = new DatePeriod($tempBegin, $tempInterval, $tempEnd);

  foreach ( $tempPeriod as $temp ) {
    echo $temp->format( "Y-d-m H:i" ) . '<br/>';
  }
}

如果您只是需要显示或分配值,@ scrowler答案就是您所需要的。

答案 1 :(得分:-1)

您可以在最长时间和最短时间内进行字符串比较:

foreach ($period as $dt) {
    $hour_and_min = $dt->format('H:i');
    if($hour_and_min >= '08:00' && $hour_and_min <= '20:00') {
        echo $dt->format( "Y-d-m H:i" ) . '<br/>' . PHP_EOL;
    }
}

Example

编辑:您的“早上8点到晚上8点”和“晚上8点到早上8点”之间的条件有点含糊不清,无论您是否在其中任何一个语句中包括上午8点和晚上8点...通过将低于或等于和大于或等于运营商改为LT或GT来适应:$hour_and_min > '08:00' && $hour_and_min < '20:00'