在同一天内,在两个时间之间以15分钟为单位打印时间。

12
我想制作一个循环,输出以下内容:
08:00
08:15
08:30
08:45
09:00
09:15
09:30
09:45
...etc

我需要它从 08:0017:00

这是我目前的代码:

function echo_datelist ($i, $j, $day, $month, $year)
{
    $time = str_pad($i, 2, '0', STR_PAD_LEFT).':'.str_pad($j, 2, '0', STR_PAD_LEFT);            
    $date = strtotime("$month $day $year $time:00");
    $sql = mysql_query("select b.room_type, c.name from bookings as b, customers as c where b.the_date='$date' and b.id_customer=c.id");
    
    echo $time.'<br />';
}

for ($i = 8; $i <= 16; $i++)
{
    for ($j = 0; $j <= 45; $j+=15)
        echo_datelist($i, $j, $day, $month, $year);
    
    echo_datelist(17, 0, $day, $month, $year);
}
问题是,在每个小时之间输出了一个17:00,示例:
08:00
08:15
08:30
08:45
17:00
09:00
09:15
09:30
09:45
17:00

顺便说一句,我知道不应该对数据库进行反复访问,但这个问题解决后我会解决那个问题。


2
将您最后的 echo_datelist 调用移出 for $i 循环。 - Flambino
10个回答

22

也可以使用range函数进行操作

<?php
date_default_timezone_set("Europe/London");
$range=range(strtotime("08:00"),strtotime("17:00"),15*60);
foreach($range as $time){
        echo date("H:i",$time)."\n";
}
?>

所以你没有循环,它只是为你创建了一个数组(我的循环只是为了在格式化输出时打印出来)


1
那是最佳/最优的选择,谢谢。 - mlinuxgada
非常好!在我看来,时区在这里是无用的。 - Tommix
让事情变得非常简单,你也不必担心AM / PM和12:00的问题,谢谢 - Zachary Weixelbaum

12

我觉得这看起来有点不必要复杂。下面的代码可以打印出您想要的内容。可能需要对其进行一些调整以适应您的代码。对于代码末尾的混乱结束条件感到抱歉。

$min=array("00","15","30","45");

for($i=8;$i<17;$i++)
  foreach ($min as $v)
    print "$i:$v\n";
print "17:00\n";

或者,如果你想以稍微更加不透明的方式来完成这个操作...

for($i=8*60;$i<=17*60;$i+=15)
  print floor($i/60) . ":" . ($i/60-floor($i/60))*60 . "\n";

上述代码计算了8点钟的分钟值,然后重复添加15分钟。接着使用一些数学方法从运行中的变量中提取小时和分钟。


取模运算看起来更加优美:printf("%d:%02d\n", (int)$i/60, $i%60); - Joost

9

我的简单逻辑如下:

   $start=strtotime('00:00');
   $end=strtotime('23:30');

    for ($i=$start;$i<=$end;$i = $i + 15*60)
    {

     //write your if conditions and implement your logic here

     echo date('g:i A',$i).'<br>';

    }

在循环中,您可以玩您想要的内容。

8
你需要将最后一行代码移到外层for循环之外。
for ($i = 8; $i <= 16; $i++){
  for ($j = 0; $j <= 45; $j+=15){
    //inside the inner loop
    echo_datelist($i, $j, $day, $month, $year);
  }
  //inside the outer loop
}
//outside the outer loop
echo_datelist(17, 0, $day, $month, $year);

简单来说,您的意思是:
For each hour between 8 and 16
  For each 15 minute interval
    Echo the time
  End
  Echo 17:00
End

改为:

For each hour between 8 and 16
  For each 15 minute interval
    Echo the time
  End
End
Echo 17:00

我建议你执行一次全天的SQL查询,然后在其中挑选出符合时间段的结果,否则你将需要为每个15分钟的时间间隔执行一次SQL查询(使用你提供的样本数据需要执行37次查询)。


1

1

0

我曾经在处理一个类似的问题,但是开始/结束时间是可变的。

这可能需要一些微调,但我无法破解它。

你只需要在开始时提供日期和时间即可。

$day = "10/14/2011";

$startTime = date(strtotime($day." 16:00"));
$endTime = date(strtotime($day." 19:15"));

$timeDiff = round(($endTime - $startTime)/60/60);

$startHour = date("G", $startTime);
$endHour = $startHour + $timeDiff; 

for ($i=$startHour; $i <= $endHour; $i++)
{
     for ($j = 0; $j <= 45; $j+=15)
        {
                $time = $i.":".str_pad($j, 2, '0', STR_PAD_LEFT);

                echo (date(strtotime($day." ".$time)) <= $endTime) ? date("g:i", strtotime($day." ".$time))."<br>" : "";
        }
}

输出:

4:00 4:15 4:30 4:45 5:00 5:15 5:30 5:45 6:00 6:15 6:30 6:45 7:00 7:15


0

使用明确的边界和时间间隔设置DateTime对象可以使此过程非常干净。请记得将结束时间设置为您想要的时间之后,因为DatePeriod“排除”结束日期时间。

代码:(演示

$period = new DatePeriod(
     new DateTime('08:00:00'),
     new DateInterval('PT15M'),
     new DateTime('17:00:01')
);

foreach ($period as $dt) {
    echo $dt->format("H:i") . "\n";
}

输出:

08:00
08:15
08:30
08:45
09:00
09:15
09:30
09:45
10:00
10:15
10:30
10:45
11:00
11:15
11:30
11:45
12:00
12:15
12:30
12:45
13:00
13:15
13:30
13:45
14:00
14:15
14:30
14:45
15:00
15:15
15:30
15:45
16:00
16:15
16:30
16:45
17:00

0
我想出了这个程序,可以根据你想要的增量打印时间,而且你可以更改时间来显示13:00或下午1点。
<?php
        $start=strtotime('00:00');
        $end=strtotime('23:30');
        $increase = 15; // How many minute to increase
        
        for ($i=$start;$i<=$end;$i = $i + $increase*60)
       {
        if(date('H', $i) > 12 ){ //Here we check if the hour is bigger than 12, then we just do math -12 which will result in hour, for example 13PM which is 13-12=1PM
          $hour = date('H', $i) - 12;
          echo $hour.date(':i A',$i);
          }else{
           echo date('H:i A',$i);
          }
        }
        

       ?>

上一个代码结果

00:00 AM
00:15 AM
00:30 AM
00:45 AM
01:00 AM
01:15 AM
01:30 AM
01:45 AM
02:00 AM
02:15 AM
02:30 AM
02:45 AM
03:00 AM
03:15 AM
03:30 AM
03:45 AM
04:00 AM
04:15 AM
04:30 AM
04:45 AM
05:00 AM
05:15 AM
05:30 AM
05:45 AM
06:00 AM
06:15 AM
06:30 AM
06:45 AM
07:00 AM
07:15 AM
07:30 AM
07:45 AM
08:00 AM
08:15 AM
08:30 AM
08:45 AM
09:00 AM
09:15 AM
09:30 AM
09:45 AM
10:00 AM
10:15 AM
10:30 AM
10:45 AM
11:00 AM
11:15 AM
11:30 AM
11:45 AM
12:00 PM
12:15 PM
12:30 PM
12:45 PM
1:00 PM
1:15 PM
1:30 PM
1:45 PM
2:00 PM
2:15 PM
2:30 PM
2:45 PM
3:00 PM
3:15 PM
3:30 PM
3:45 PM
4:00 PM
4:15 PM
4:30 PM
4:45 PM
5:00 PM
5:15 PM
5:30 PM
5:45 PM
6:00 PM
6:15 PM
6:30 PM
6:45 PM
7:00 PM
7:15 PM
7:30 PM
7:45 PM
8:00 PM
8:15 PM
8:30 PM
8:45 PM
9:00 PM
9:15 PM
9:30 PM
9:45 PM
10:00 PM
10:15 PM
10:30 PM
10:45 PM
11:00 PM
11:15 PM
11:30 PM

如果您不需要1PM 2PM方法,则可以直接使用相同的代码并刪除減法運算,通過移除if方法並替換它。
echo date('H:i A',$i);

0
echo_datelist(17, 0, $day, $month, $year);

将该行移动到最外层for循环之后。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接