如何以半个小时的时间间隔制作一系列时间?
答
感谢您重新打开问题alex。
这是一个应该与功能程序员产生共鸣的解决方案。
function halfHourTimes() {
$formatter = function ($time) {
if ($time % 3600 == 0) {
return date('ga', $time);
} else {
return date('g:ia', $time);
}
};
$halfHourSteps = range(0, 47*1800, 1800);
return array_map($formatter, $halfHourSteps);
}
答
我决定这一次是更好:)
function hoursRange($lower = 0, $upper = 23, $step = 1, $format = NULL) {
if ($format === NULL) {
$format = 'g:ia'; // 9:30pm
}
$times = array();
foreach(range($lower, $upper, $step) as $increment) {
$increment = number_format($increment, 2);
list($hour, $minutes) = explode('.', $increment);
$date = new DateTime($hour . ':' . $minutes * .6);
$times[(string) $increment] = $date->format($format);
}
return $times;
}
答
这也许是一个更优雅的方式,但它需要的时间是在几秒钟内(也使得它更灵活)。
function time_range($start, $end, $step = 1800) {
$return = array();
for($time = $start; $time <= $end; $time += $step)
$return[] = date('g:ia', $time);
return $return;
}
答
下面是一个使用秒更精确的Alex's function的改进版本:
function hoursRange($lower = 0, $upper = 86400, $step = 3600, $format = '') {
$times = array();
if (empty($format)) {
$format = 'g:i a';
}
foreach (range($lower, $upper, $step) as $increment) {
$increment = gmdate('H:i', $increment);
list($hour, $minutes) = explode(':', $increment);
$date = new DateTime($hour . ':' . $minutes);
$times[(string) $increment] = $date->format($format);
}
return $times;
}
因此,为了用1小时的间隔时间的阵列在24小时时间段期间,使用默认值:
hoursRange();
,这将给你如下:
Array
(
[00:00] => 12:00 am
[01:00] => 1:00 am
[02:00] => 2:00 am
[03:00] => 3:00 am
[04:00] => 4:00 am
[05:00] => 5:00 am
[06:00] => 6:00 am
[07:00] => 7:00 am
[08:00] => 8:00 am
[09:00] => 9:00 am
[10:00] => 10:00 am
[11:00] => 11:00 am
[12:00] => 12:00 pm
[13:00] => 1:00 pm
[14:00] => 2:00 pm
[15:00] => 3:00 pm
[16:00] => 4:00 pm
[17:00] => 5:00 pm
[18:00] => 6:00 pm
[19:00] => 7:00 pm
[20:00] => 8:00 pm
[21:00] => 9:00 pm
[22:00] => 10:00 pm
[23:00] => 11:00 pm
)
这里有几个例子使用:
// Every 15 Minutes, All Day Long
$range = hoursRange(0, 86400, 60 * 15);
// Every 30 Minutes from 8 AM - 5 PM, using Custom Time Format
$range = hoursRange(28800, 61200, 60 * 30, 'h:i a');
+0
看起来不错 - 只是不确定为什么要爆炸'$ increment'而不是直接将它传递到DateTime构造函数中? – 2015-10-21 17:26:56
答
简单的解决方案
$h = 0;
while ($h < 24) {
$key = date('H:i', strtotime(date('Y-m-d') . ' + ' . $h . ' hours'));
$value = date('h:i A', strtotime(date('Y-m-d') . ' + ' . $h . ' hours'));
$formatter[$key] = $value;
$h++;
}
结果是:
Array
(
[00:00] => 12:00 AM
[01:00] => 01:00 AM
[02:00] => 02:00 AM
[03:00] => 03:00 AM
[04:00] => 04:00 AM
[05:00] => 05:00 AM
[06:00] => 06:00 AM
[07:00] => 07:00 AM
[08:00] => 08:00 AM
[09:00] => 09:00 AM
[10:00] => 10:00 AM
[11:00] => 11:00 AM
[12:00] => 12:00 PM
[13:00] => 01:00 PM
[14:00] => 02:00 PM
[15:00] => 03:00 PM
[16:00] => 04:00 PM
[17:00] => 05:00 PM
[18:00] => 06:00 PM
[19:00] => 07:00 PM
[20:00] => 08:00 PM
[21:00] => 09:00 PM
[22:00] => 10:00 PM
[23:00] => 11:00 PM
)
答
这里有一个更灵活的版本,不需要日期时间(因为我们已经与时间戳以秒为工作反正)。 ;-)
function get_hours_range($start = 0, $end = 86400, $step = 3600, $format = 'g:i a') {
$times = array();
foreach (range($start, $end, $step) as $timestamp) {
$hour_mins = gmdate('H:i', $timestamp);
if (! empty($format))
$times[$hour_mins] = gmdate($format, $timestamp);
else $times[$hour_mins] = $hour_mins;
}
return $times;
}
答
这里是我的建议:
$start = new \DateTime('00:00');
$times = 24 * 2; // 24 hours * 30 mins in an hour
for ($i = 0; $i < $times-1; $i++) {
$result[] = $start->add(new \DateInterval('PT30M'))->format('H:i A');
}
print_r($result);
希望这有助于。
不错的解决方案!我认为它需要PHP 5.3的函数分配给一个变量? +1(不要担心重新开放,如果我知道你在努力解决问题,我永远不会删除它)。 – alex 2010-10-11 23:22:31