如何以半个小时的时间间隔制作一系列时间?

问题描述:

我需要的,像这样一个时间列表阵列中的...如何以半个小时的时间间隔制作一系列时间?

12am 
12:30am 
1:00pm 
... 

我怎样才能做到这一点用PHP?

感谢您重新打开问题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); 
} 
+0

不错的解决方案!我认为它需要PHP 5.3的函数分配给一个变量? +1(不要担心重新开放,如果我知道你在努力解决问题,我永远不会删除它)。 – alex 2010-10-11 23:22:31

我决定这一次是更好:)

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'); 

您可以查看working snippet at CodePad

+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); 

希望这有助于。