Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate array of times (as strings) for every X minutes in JavaScript

I'm trying to create an array of times (strings, not Date objects) for every X minutes throughout a full 24 hours. For example, for a 5 minute interval the array would be:

['12:00 AM', '12:05 AM', '12:10 AM', '12:15 AM', ..., '11:55 PM'] 

My quick and dirty solution was to use 3 nested for loops:

var times = []   , periods = ['AM', 'PM']   , hours = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]   , prop = null   , hour = null   , min = null;   for (prop in periods) {   for (hour in hours) {     for (min = 0; min < 60; min += 5) {       times.push(('0' + hours[hour]).slice(-2) + ':' + ('0' + min).slice(-2) + " " + periods[prop]);     }   } } 

This outputs the desired result but I'm wondering if there's a more elegant solution. Is there a way to do this that's:

  • more readable
  • less time complex
like image 576
Brett DeWoody Avatar asked Mar 21 '16 07:03

Brett DeWoody


1 Answers

If the interval is only to be set in minutes[0-60], then evaluate the below solution w/o creating the date object and in single loop:

var x = 5; //minutes interval  var times = []; // time array  var tt = 0; // start time  var ap = ['AM', 'PM']; // AM-PM    //loop to increment the time and push results in array  for (var i=0;tt<24*60; i++) {    var hh = Math.floor(tt/60); // getting hours of day in 0-24 format    var mm = (tt%60); // getting minutes of the hour in 0-55 format    times[i] = ("0" + (hh % 12)).slice(-2) + ':' + ("0" + mm).slice(-2) + ap[Math.floor(hh/12)]; // pushing data in array in [00:00 - 12:00 AM/PM format]    tt = tt + x;  }    console.log(times);
like image 80
Harpreet Avatar answered Sep 22 '22 14:09

Harpreet