在JavaScript中创建时间点数组

时间:2017-05-20 14:47:15

标签: javascript arrays

如何制作一系列时间点,以便获得['00:00', '00:15', '00:30', '00:45', '01:00', '01:15', '01:30', '01:45', '02:00', ...]

我想出了

const timePoints = new Array(24 * 4).fill(0).map((time, i) => {
  const seconds = i * 15 * 60;
  const minutes = seconds / 60;
  return `${Math.floor(minutes / 60)}:${seconds / 60 % 60}`;
});

console.log(timePoints);

它确实有效,但我实际上希望数组从最接近实际时间的季度开始。

所以,如果时钟是16:35,我希望它从'16:45'开始,给我一个数组['16:45', '17:00', '17:15', ...]

这可能类似于首先找到开始时间,创建循环迭代24 * 4次,然后分别提取小时和分钟,然后在小时中添加0或1,并从中添加15或减去45分钟。

但是可以使用更聪明的解决方案

4 个答案:

答案 0 :(得分:1)

您可以将“实际时间”转换为数字然后执行此操作:

const timePoints = ["00:00", "00:15", "00:30", "00:45", "01:00", "01:15", "01:30", "01:45", "02:00", "02:15", "02:30", "02:45", "03:00", "03:15", "03:30", "03:45", "04:00", "04:15", "04:30", "04:45", "05:00", "05:15", "05:30", "05:45", "06:00", "06:15", "06:30", "06:45", "07:00", "07:15", "07:30", "07:45", "08:00", "08:15", "08:30", "08:45", "09:00", "09:15", "09:30", "09:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00", "20:15", "20:30", "20:45", "21:00", "21:15", "21:30", "21:45", "22:00", "22:15", "22:30", "22:45", "23:00", "23:15", "23:30", "23:45"];

// Helper method to rotate the array.
Array.prototype.rotate = function(n) {
  return this.slice(n, this.length).concat(this.slice(0, n));
}

// Get time as a float here:
var myTime = 19.48;
// Convert the times to floats.
var values = timePoints.map(x => +x.replace(/:/, '.'));

// You can do this to get the next value.
// var next = timePoints[values.findIndex(x => x - myTime > 0)] || timePoints[0];
// console.log(next);

// Find the index for the first value that results in a positive number 
// when you subtract myTime, or take 0 if none can be found.
var nextIndex = Math.max(values.findIndex(x => x - myTime > 0), 0);
// Rotate the array this many positions.
var newArr = timePoints.rotate(nextIndex);

console.log(newArr);

答案 1 :(得分:1)

您可以使用getHoursgetMinutes来获取小时部分和分钟部分 并且有一些简单的loping它应该是可能的。看下面的代码:

var hours = new Date().getHours();
var mins = new Date().getMinutes();
var minutes = getClosestQuarter(mins) * 15;

function getClosestQuarter(mins) {
  return Math.floor(mins / 15) + 1;
}
var minPart = minutes - 15;

var ans = [];

for (var i = 0; i < 24 * 4; i++) {
  minPart += 15;
  if (minPart == 60) {
    minPart = 0;
    hours++;
    if (hours > 23) {
      hours = 0;
    }
  }
  ans.push(getTimeString(hours, minPart));
}

function getTimeString(hours, mins) {
  hours = hours ? hours.toString() : '00';
  hours = hours.length == 1 ? '0' + hours : hours;
  mins = mins ? mins.toString() : '00';
  return hours + ':' + mins;
}
console.log(ans);

答案 2 :(得分:1)

您可以使用reduce并将当前时间作为起始值传递。使用toTimeString提取hh:mm格式,使您无法使用2位数格式化分钟:

const timePoints = new Array(24 * 4).fill(0).reduce(([arr, d], time) => {
  d.setMinutes(Math.ceil((d.getMinutes() + 1) / 15) * 15);
  return [arr.concat(d.toTimeString().substr(0,5)), d];
}, [[], new Date()])[0];

console.log(timePoints);

答案 3 :(得分:0)

使用Date对象执行此操作的另一种方法:

var d = new Date();
// use Math.ceil to always round up
d.setMinutes(Math.round(d.getMinutes() / 15) * 15);
console.log("Rounded datetime: ", d);
var hours,
  minutes,
  arr = [];

for (var i = 0; i < 96; i++) {
  hours = ("0" + d.getHours()).slice(-2);
  minutes = ("0" + d.getMinutes()).slice(-2);
  arr.push(hours + ":" + minutes);
  d.setMinutes(d.getMinutes() + 15);
}
console.log(arr);