代码之家  ›  专栏  ›  技术社区  ›  alex

我怎样才能用半小时的间隔来排列时间?

php
  •  8
  • alex  · 技术社区  · 14 年前

    我需要一个数组中的时间列表…

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

    如何使用PHP来完成此操作?

    7 回复  |  直到 8 年前
        1
  •  10
  •   erisco    14 年前

    感谢您重新打开问题亚历克斯。

    这是一个应该引起功能程序员共鸣的解决方案。

    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
  •  20
  •   Community CDub    8 年前

    这是改进版的 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 .

        3
  •  8
  •   alex    14 年前

    我觉得这个更好:)

    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;
    }
    
        4
  •  1
  •   Kalim    10 年前

    最简单的解决方案

    $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
    )
    
        5
  •  1
  •   Lano    8 年前

    这是我的建议:

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

    希望这有帮助。

        6
  •  0
  •   Matěj G.    14 年前

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

    function time_range( $start, $end, $step = 1800 ) {
        $return = array();
        for( $time = $start; $time <= $end; $time += $step )
            $return[] = date( 'g:ia', $time );
        return $return;
    }
    
        7
  •  0
  •   JS Morisset    9 年前

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

    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;
    }
    
    推荐文章