以半小时为增量在时间范围内循环


Loop through range of time in half hour increments

我想知道如何在php中使用30分钟的步骤来循环时间。我希望输出是这样的:

<select style='width:250px;' name='days' onchange='return timeSchedvalue(this.value)'>
  <option value='6:00-6:30 am'>6:00-7:30 am</option>
  <option value='6:30-7:00 am'>6:30-7:00 am</option>
  <option value='7:30-8:00 am'>7:30-8:00 am</option>
  <option value='8:00-8:30 am'>8:00-8:30 am</option>
  <option value='8:30-9:00 am'>8:30-9:00 am</option>
  <option value='9:00-9:30 am'>9:00-9:30 am</option>
  <option value='9:30-10:00 am'>9:30-10:00 am</option>
  <option value='10:00-10:30 am'>10:00-10:30 am</option>
  <option value='10:30-11:00 am'>10:30-11:00 am</option>
  <option value='11:00-11:30 am'>11:00-11:30 am</option>
  <option value='11:30-12:00 am'>11:30-12:00 am</option>
  <option value='12:00-12:30 pm'>12:00-12:30 pm</option>
</select>

循环将于早上6点至6点30分开始,并于晚上10点至10点30分结束。

$time = mktime(0, 0, 0, 1, 1);
for ($i = 0; $i < 86400; $i += 1800) {  // 1800 = half hour, 86400 = one day
    printf('<option value="%1$s-%2$s">%1$s-%2$s</option>',
           date('g:i', $time + $i), date('g:i a', $time + $i + 1800));
}

根据需要掌握开始时间和结束条件。

如果您愿意,可以使用它。

for ($x = 6,$x1 = 1; $x < 22.5; $x+=0.5,$x1++) 
{ 
$gen_date=date('h:i A', mktime(0, 0, 0) + (60 * $x * 60));
$temp=$x+0.5;
$gen_date1=date('h:i A', mktime(0, 0, 0) + (60 * $temp * 60));
echo $x1.'='.$gen_date.'-'.$gen_date1.'<br>';
}

使用$x1作为索引。根据您的需要编辑

<select style='width:250px;' name='days' onchange='return timeSchedvalue(this.value)'>
<?php
     $time = '6:00'; // start
     for ($i = 0; $i <= 12; $i++)
     {
         $prev = date('g:i a', strtotime($time)); // format the start time
         $next = strtotime('+30mins', strtotime($time)); // add 30 mins
         $time = date('g:i a', $next); // format the next time
         echo "<option value='"$prev - $time'">$prev - $time</option>";
     }
 ?>
</select>

好吧,最简单的方法是保留一个所有区间的数组并循环通过它,也许像:

array ('06:00', '06:30', '07:00', '07:30'... );

或者可能类似于:

array ('06:00 - 06:30', '06:30 - 07:00', '07:00 - 07:30'...);

您可以使用mktime创建时间,并使用日期对其进行格式化。

在您的情况下,您需要创建一个开始时间6:00 am->mktime(6,0,0,0,0,0(

那么你需要每次增加30分钟。。。

这可以在for循环中轻松完成:

<select style='width:250px;' name='days' onchange='return timeSchedvalue(this.value)'>
<?php
 for ($i = 0; $i <= 960; $i+=30) {
    $time1 = date('h:i a', mktime(6, $i, 0, 0, 0, 0));
    $time2 = date('h:i a', mktime(6, $i+30, 0, 0, 0, 0));
    echo "<option value='" . $time1 . " - " . $time2 . "'>" .$time1 . " - " . $time2 . "</option>";
}
?>
</select>

应该这样做。你基本上是一次添加30分钟的块,然后循环直到得到正确数量的选项。

//get the timestamp for 6.30 am
$time   = strtotime('6.30 am'); //not important what the date is.
//start adding 30mins
$times      = array();
$halfHour   = 60 * 30;
$blocks     = 12; //adjust this to get the number of options
while ($blocks) {
    $times[]  = date('h:i', $time) . ' - ' . date('h:i a', ($time += $halfHour)); //I keep incrementing the time by half an hour
    $blocks--;
}
var_dump($times);

这只需循环每半个小时,然后在每个周期调用date。

$inc   = 30 * 60;
$start = (strtotime('6AM')); // 6  AM
$end   = (strtotime('10PM')); // 10 PM
echo "<select>";
for( $i = $start; $i <= $end; $i += $inc )
{
    // to the standart format
    $range = date( 'g:i', $i ) . ' - ' . 
             // $inc = 30 minutes so this will be .5 hr later
             date( 'g:i A', $i + $inc );
    echo "<option value='"$range'">$range</option>" . PHP_EOL;
}
echo "</select>";
<?php
    $timeFormat = "%02d:%02d";
    $startHour = 6;
    $endHour = 12;
    $timeInterval = 30; // in minutes
    $currentHour = $startHour;
    $currentMinute = 0;
    while ($currentHour <= $endHour) {
        $timeRange = sprintf($timeFormat, $currentHour, $currentMinute) . ($currentHour < 12 ? " am" : " pm");
        $currentMinute = $currentMinute + $timeInterval;
        if ($currentMinute > 59) {
            $currentHour++;
            $currentMinute = $currentMinute - 60;
        }
        $timeRange .= " - " . sprintf($timeFormat, $currentHour, $currentMinute) . ($currentHour < 12 ? " am" : " pm");
        if ($currentHour <= $endHour) {
            echo "## " . $timeRange . "'n";         
        }       
    }
?>

在确定开始和结束时间后,您可以循环通过DateTime时段(结束时间是"独占的"——您需要稍微超过晚上10:00,以便将其包括在内;我使用的是晚上10:30(。将间隔设置为30分钟,然后循环。迭代时,modify()将当前日期时间对象再增加30分钟,以创建每个范围的结束时间。

注意,我分离了a(am/pm(表达式——这是因为您希望11:30 - 12:00am。如果首先调用modify(),那么a将是pm。因此,我更改了printf()的第一个参数中占位符的顺序——%3$s写在%2$s之前。

这也是通知您使用与选项文本相同的value属性值膨胀html标记没有任何好处的最佳时机。表单提交和javascript操作仍将完全相同,不会出现错误。当它们相同时,不要将选项文本重复为选项value

代码:(演示(

$period = new DatePeriod(
     new DateTime('today 06:00:00'),
     new DateInterval('PT30M'),
     new DateTime('today 22:30:00')
);
foreach ($period as $dt) {
    printf(
        '<option>%1$s - %3$s %2$s</option>' . "'n",
        $dt->format('h:i'),
        $dt->format('a'),
        $dt->modify('+30 minutes')->format('h:i')
    );
}

输出:

<option>06:00 - 06:30 am</option>
<option>06:30 - 07:00 am</option>
<option>07:00 - 07:30 am</option>
<option>07:30 - 08:00 am</option>
<option>08:00 - 08:30 am</option>
<option>08:30 - 09:00 am</option>
<option>09:00 - 09:30 am</option>
<option>09:30 - 10:00 am</option>
<option>10:00 - 10:30 am</option>
<option>10:30 - 11:00 am</option>
<option>11:00 - 11:30 am</option>
<option>11:30 - 12:00 am</option>
<option>12:00 - 12:30 pm</option>
<option>12:30 - 01:00 pm</option>
<option>01:00 - 01:30 pm</option>
<option>01:30 - 02:00 pm</option>
<option>02:00 - 02:30 pm</option>
<option>02:30 - 03:00 pm</option>
<option>03:00 - 03:30 pm</option>
<option>03:30 - 04:00 pm</option>
<option>04:00 - 04:30 pm</option>
<option>04:30 - 05:00 pm</option>
<option>05:00 - 05:30 pm</option>
<option>05:30 - 06:00 pm</option>
<option>06:00 - 06:30 pm</option>
<option>06:30 - 07:00 pm</option>
<option>07:00 - 07:30 pm</option>
<option>07:30 - 08:00 pm</option>
<option>08:00 - 08:30 pm</option>
<option>08:30 - 09:00 pm</option>
<option>09:00 - 09:30 pm</option>
<option>09:30 - 10:00 pm</option>
<option>10:00 - 10:30 pm</option>