我想知道如何在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:00
说am
。如果首先调用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>