【问题标题】:How can I make an array of times with half hour intervals?如何以半小时为间隔创建一个时间数组?
【发布时间】:2010-10-11 03:16:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: php


    【解决方案1】:

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

    【讨论】:

    • 看起来不错 - 只是不知道为什么要爆炸 $increment 而不是直接将其传递给 DateTime 构造函数?
    • 另外,您可以删除 if(格式)并在函数中传递该默认变量。
    • 这可能很方便添加。它将时间字符串转换为秒/** * Takes hour:minutes:seconds (8:15:00) OR minutes:seconds (15:00) * @param string $time * @return int */ function timeToSeconds(string $time): int { $timeParts = explode(':', $time); return 3 === count($timeParts) ? $timeParts[0] * 3600 + $timeParts[1] * 60 + $timeParts[2] : $timeParts[0] * 60 + $timeParts[1]; }
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不错的解决方案!我假设它需要 PHP 5.3 并将函数分配给变量? +1(不用担心重新打开,如果我知道你在努力解决问题,我永远不会删除它)。
      【解决方案4】:

      我认为这个更好:)

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

      【讨论】:

        【解决方案5】:

        这是我的建议:

            $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】:

          最简单的解决方案

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

          【讨论】:

            【解决方案7】:

            将索引值添加为小时:

            代码如下:

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                这是一个更灵活的版本,它不需要 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;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-12-21
                  • 1970-01-01
                  • 2015-08-31
                  相关资源
                  最近更新 更多