如何制作一系列时间点,以便获得['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分钟。
但是可以使用更聪明的解决方案
答案 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)
您可以使用getHours
和getMinutes
来获取小时部分和分钟部分
并且有一些简单的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);