如何以半小时的间隔进行一次数组?

时间:2010-10-11 03:16:07

标签: php

我需要一个像数组这样的时间列表...

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

如何使用PHP执行此操作?

9 个答案:

答案 0 :(得分:20)

这是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;
}

因此,要在24小时内制作一个时间间隔为1小时的数组,请使用默认值:

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

答案 1 :(得分:10)

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

答案 2 :(得分:8)

我认为这个更好:)

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;
}

答案 3 :(得分:1)

最简单的解决方案

$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
)

答案 4 :(得分:1)

这是我的建议:

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

希望得到这个帮助。

答案 5 :(得分:0)

这可能是一种更优雅的方式,但它要求时间以秒为单位(这也使其更灵活)。

function time_range( $start, $end, $step = 1800 ) {
    $return = array();
    for( $time = $start; $time <= $end; $time += $step )
        $return[] = date( 'g:ia', $time );
    return $return;
}

答案 6 :(得分:0)

这是一个更灵活的版本,不需要DateTime(因为我们已经在几秒钟内处理了时间戳)。 ; - )

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;
}

答案 7 :(得分:0)

在这种情况下,我们可以简单地使用strtotime将时间增加N30 minutesdate函数将其格式化为所需的输出。

$startTime = strtotime('12 am');
$endTime   = strtotime('11:59 pm');

$arrInterval = [];
while($endTime >= $startTime){
  $arrInterval[] = date("h:ia", $startTime);
  $startTime = strtotime('+30 minutes', $startTime);
}

答案 8 :(得分:0)

将索引值添加为小时:

这是代码:

<?php

    $time_slot= array();
        
        if ( empty( $format ) ) {
            $format = 'H:i';
        }
        $lower = 0; $upper = 86400; $step = 3600; $format = '';
        $i = 0;
        foreach ( range( $lower, $upper, $step ) as $increment ) {
            $increment = gmdate( 'H:i', $increment );
           
        
             
            $time_slot[$i] = $increment;
            $i++;
        }
    
        print_r($time_slot);

?>

结果如下:

Array
(
    [0] => 00:00
    [1] => 01:00
    [2] => 02:00
    [3] => 03:00
    [4] => 04:00
    [5] => 05:00
    [6] => 06:00
    [7] => 07:00
    [8] => 08:00
    [9] => 09:00
    [10] => 10:00
    [11] => 11:00
    [12] => 12:00
    [13] => 13:00
    [14] => 14:00
    [15] => 15:00
    [16] => 16:00
    [17] => 17:00
    [18] => 18:00
    [19] => 19:00
    [20] => 20:00
    [21] => 21:00
    [22] => 22:00
    [23] => 23:00
    [24] => 00:00
)