例如:
Given time: 08:22 => Rounded to: 08:15
Given time: 08:23 => Rounded to: 08:30
Run Code Online (Sandbox Code Playgroud)
应该很简单.但我能够生成的只是冗长而不是很好的代码来解决这个问题.我的思绪一片空白.
问候
Rob*_*nik 91
假设您在变量中有小时和分钟(如果不这样,您可以Date通过使用Date实例函数从实例中获取它们):
var m = (parseInt((minutes + 7.5)/15) * 15) % 60;
var h = minutes > 52 ? (hours === 23 ? 0 : ++hours) : hours;
Run Code Online (Sandbox Code Playgroud)
分钟也可以通过使用Math.round()以下方式计算:
var m = (Math.round(minutes/15) * 15) % 60;
Run Code Online (Sandbox Code Playgroud)
或者在没有任何功能的更复杂的javascript表达式中执行此操作:
var m = (((minutes + 7.5)/15 | 0) * 15) % 60;
var h = ((((minutes/105) + .5) | 0) + hours) % 24;
Run Code Online (Sandbox Code Playgroud)
您可以检查显示Math.round()三个中最慢的jsPerf测试,而主要是最后一个是最快的,因为它只是一个没有任何函数调用的表达式(没有函数调用开销,即堆栈操作,尽管在Javascript VM中可以区别对待本机函数).// ----
Ant*_*ois 13
此功能将时间四舍五入到最近的四分之一小时.
function roundTimeQuarterHour(time) {
var timeToReturn = new Date(time);
timeToReturn.setMilliseconds(Math.round(timeToReturn.getMilliseconds() / 1000) * 1000);
timeToReturn.setSeconds(Math.round(timeToReturn.getSeconds() / 60) * 60);
timeToReturn.setMinutes(Math.round(timeToReturn.getMinutes() / 15) * 15);
return timeToReturn;
}
Run Code Online (Sandbox Code Playgroud)
这是一个方法,它会像您提供的那样对时间字符串进行舍入.例如"08:22"
let roundTime = (time, minutesToRound) => {
let [hours, minutes] = time.split(':');
hours = parseInt(hours);
minutes = parseInt(minutes);
// Convert hours and minutes to time in minutes
time = (hours * 60) + minutes;
let rounded = Math.round(time / minutesToRound) * minutesToRound;
let rHr = ''+Math.floor(rounded / 60)
let rMin = ''+ rounded % 60
return rHr.padStart(2, '0')+':'+rMin.padStart(2, '0')
}
// USAGE //
// Round time to 15 minutes
roundTime('8:07', 15); // "08:00"
roundTime('7:53', 15); // "08:00"
roundTime('7:52', 15); // "07:45"
Run Code Online (Sandbox Code Playgroud)
如果您不需要解析像示例所示的小时和分钟字符串,则可以使用此方法
let roundTime = (hours, minutes, minutesToRound) => {
// Convert hours and minutes to minutes
time = (hours * 60) + minutes;
let rounded = Math.round(time / minutesToRound) * minutesToRound;
let roundedHours = Math.floor(rounded / 60)
let roundedMinutes = rounded % 60
return { hours: roundedHours, minutes: roundedMinutes }
}
// USAGE //
// Round time to 15 minutes
roundTime(7, 52, 15); // {hours: 7, minutes: 45}
roundTime(7, 53, 15); // {hours: 8, minutes: 0}
roundTime(1, 10, 15); // {hours: 1, minutes: 15}
Run Code Online (Sandbox Code Playgroud)
或者,如果要将已存在的日期对象四舍五入到最接近的x分钟,则可以使用此方法.
如果你没有给它任何日期,它将围绕当前时间.在您的情况下,您可以舍入到最近的15分钟.
let getRoundedDate = (minutes, d=new Date()) => {
let ms = 1000 * 60 * minutes; // convert minutes to ms
let roundedDate = new Date(Math.round(d.getTime() / ms) * ms);
return roundedDate
}
// USAGE //
// Round existing date to 5 minutes
getRoundedDate(15, new Date()); // 2018-01-26T00:45:00.000Z
// Get current time rounded to 30 minutes
getRoundedDate(30); // 2018-01-26T00:30:00.000Z
Run Code Online (Sandbox Code Playgroud)
这里的代码有点冗长,但我相信你会看到如何组合这些线来缩短它.我已经这样做了,以清楚地显示步骤:
var now = new Date();
var mins = now.getMinutes();
var quarterHours = Math.round(mins/15);
if (quarterHours == 4)
{
now.setHours(now.getHours()+1);
}
var rounded = (quarterHours*15)%60;
now.setMinutes(rounded);
document.write(now);
Run Code Online (Sandbox Code Playgroud)
除以 9e5 毫秒(15 * 60 * 1000),四舍五入,再乘以 9e5 :
const roundToQuarter = date => new Date(Math.round(date / 9e5) * 9e5)
console.log( roundToQuarter(new Date("1999-12-31T23:52:29.999Z")) ) // 1999-12-31T23:45:00
console.log( roundToQuarter(new Date("1999-12-31T23:52:30.000Z")) ) // 2000-01-01T00:00:00
console.log( roundToQuarter(new Date) )Run Code Online (Sandbox Code Playgroud)