How can I make an array of times with half hour intervals?

后端 未结 9 949
生来不讨喜
生来不讨喜 2020-12-06 02:27

I needed a list of times like so in an array...

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

How can I do this with PHP?

相关标签:
9条回答
  • 2020-12-06 02:48

    Simplest solution

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

    Result are:

    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
    )
    
    0 讨论(0)
  • 2020-12-06 02:49

    I decided this one was better :)

    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;
    }
    
    0 讨论(0)
  • 2020-12-06 02:51

    We can simply use strtotime to increment our time by N amount here in this case 30 minutes and date function to format it to our desired output.

    $startTime = strtotime('12 am');
    $endTime   = strtotime('11:59 pm');
    
    $arrInterval = [];
    while($endTime >= $startTime){
      $arrInterval[] = date("h:ia", $startTime);
      $startTime = strtotime('+30 minutes', $startTime);
    }
    
    0 讨论(0)
  • 2020-12-06 02:56

    Here's an improved version of Alex's function that uses seconds for more precision:

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

    So, to make an array of times with 1-hour intervals over a 24-hour time period, use the defaults:

    hoursRange();
    

    Which will give you the following:

    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
    )
    

    Here are a few example uses:

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

    You can view a working snippet at CodePad.

    0 讨论(0)
  • 2020-12-06 02:59

    Thank-you for reopening the question alex.

    This is a solution that should resonate with functional programmers.

    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 讨论(0)
  • 2020-12-06 02:59

    This is maybe a more elegant way, but it requires the times to be in seconds (that also makes it more flexible).

    function time_range( $start, $end, $step = 1800 ) {
        $return = array();
        for( $time = $start; $time <= $end; $time += $step )
            $return[] = date( 'g:ia', $time );
        return $return;
    }
    
    0 讨论(0)
提交回复
热议问题