例如:
Given time: 08:22 => Rounded to: 08:15
Given time: 08:23 => Rounded to: 08:30
应该很简单。但我能够生成的只是冗长而不是很好的代码来解决这个问题。我的思绪一片空白。
此致
答案 0 :(得分:84)
考虑到变量中有小时和分钟(如果不是,您可以使用Date
实例functions从Date
实例获取它们:
var m = (parseInt((minutes + 7.5)/15) * 15) % 60;
var h = minutes > 52 ? (hours === 23 ? 0 : ++hours) : hours;
分钟也可以使用Math.round()
:
var m = (Math.round(minutes/15) * 15) % 60;
或者在一个没有任何函数的更复杂的javascript表达式中执行它:
var m = (((minutes + 7.5)/15 | 0) * 15) % 60;
var h = ((((minutes/105) + .5) | 0) + hours) % 24;
你可以检查jsPerf测试,显示Math.round()
是三个中最慢的,而主要是最后一个是最快的,因为它只是一个没有任何函数调用的表达式(没有函数调用开销,即堆栈操作,尽管本机在Javascript VM中可以区别对待函数。
// ----
答案 1 :(得分:10)
此功能将时间四舍五入到最近的四分之一小时。
function roundTimeQuarterHour(time) {
var timeToReturn = new Date(time);
timeToReturn.setMilliseconds(Math.round(time.getMilliseconds() / 1000) * 1000);
timeToReturn.setSeconds(Math.round(timeToReturn.getSeconds() / 60) * 60);
timeToReturn.setMinutes(Math.round(timeToReturn.getMinutes() / 15) * 15);
return timeToReturn;
}
答案 2 :(得分:6)
这里的代码有点冗长,但我相信你会看到如何组合这些代码来缩短它们。我已经这样做了,以清楚地显示步骤:
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);
答案 3 :(得分:6)
这是一种方法,它会像您提供的那样对时间字符串进行舍入。例如“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"
如果您不需要像示例节目那样解析小时和分钟字符串,则可以使用此方法
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}
或者,如果您希望将现有日期对象四舍五入到最接近的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
答案 4 :(得分:1)
我使用这些代码:
function RoundUp(intervalMilliseconds, datetime){
datetime = datetime || new Date();
var modTicks = datetime.getTime() % intervalMilliseconds;
var delta = modTicks === 0 ? 0 : datetime.getTime() - modTicks;
delta += intervalMilliseconds;
return new Date(delta);
}
function RoundDown(intervalMilliseconds, datetime){
datetime = datetime || new Date();
var modTicks = datetime.getTime() % intervalMilliseconds;
var delta = modTicks === 0 ? 0 : datetime.getTime() - modTicks;
return new Date(delta);
}
function Round(intervalMilliseconds, datetime){
datetime = datetime || new Date();
var modTicks = datetime.getTime() % intervalMilliseconds;
var delta = modTicks === 0 ? 0 : datetime.getTime() - modTicks;
var shouldRoundUp = modTicks > intervalMilliseconds/2;
delta += shouldRoundUp ? intervalMilliseconds : 0;
return new Date(delta);
}
四舍五入到最接近的 5 分钟:
//with current datetime
var result = Round(5 * 60 * 1000);
//with a given datetime
var dt = new Date();
var result = Round(5 * 60 * 1000, dt);
答案 5 :(得分:0)
有一个NPM package @qc/date-round
可以使用。假设您有一个Date
实例要四舍五入
import { round } from '@qc/date-round'
const dateIn = ...; // The date to be rounded
const interval = 15 * 60 * 1000; // 15 minutes (aka quarter hour)
const dateOut = round(dateIn, interval)
然后您可以使用date-fns
设置日期格式
import format from 'date-fns/format';
console.log(format(dateOut, 'HH:mm')) // 24-hr
console.log(format(dateOut, 'hh:mm a')) // 12-hr
答案 6 :(得分:0)
除以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) )
答案 7 :(得分:0)
另一个带有date-fns的日期(不是强制性的)
.txt
答案 8 :(得分:0)
传递间隔(以毫秒为单位)以向上取整顺序获取下一个周期
例如,如果我要从当前时间开始下一个15分钟的周期,则调用此方法,例如* calculateNextCycle(15 * 60 * 1000); *
四分之一小时的时间过去了
function calculateNextCycle(interval) {
const timeStampCurrentOrOldDate = Date.now();
const timeStampStartOfDay = new Date().setHours(0, 0, 0, 0);
const timeDiff = timeStampCurrentOrOldDate - timeStampStartOfDay;
const mod = Math.ceil(timeDiff / interval);
return new Date(timeStampStartOfDay + (mod * interval));
}
console.log(calculateNextCycle(15 * 60 * 1000));
答案 9 :(得分:0)
这个方法是专门针对 Vue.js 的,它需要一些时间,并返回到最近输入的增量,我基于上面的答案,但这是专门针对使用 echma-6 标准的 Vue。如果您将 06:05 输入其中,它将返回 T:06:00:00。这专门用于 vuetify 的 v-calendar
以选择每周或每天格式的时间。
此答案还为 06 小时添加了 0。这是与上述答案不同的地方。如果将 30 更改为 15
methods: {
roundTimeAndFormat(datetime, roundTo) {
const hrsMins = datetime.split(':')
let min = ((((hrsMins[1] + 7.5) / roundTo) | 0) * roundTo) % 60
let hr = (((hrsMins[1] / 105 + 0.5) | 0) + hrsMins[0]) % 24
if (Number(hr) < 10) {
hr = ('0' + hr).slice(-2)
}
if (min === 0) {
min = ('0' + min).slice(-2)
}
return 'T' + hr + ':' + min + ':00'
}
}
您只需调用:
this.roundTimeAndFormat(dateTime, 15)
您将获得最接近 15 分钟间隔的时间。 如果你输入,11:01,你会得到 T11:00:00
答案 10 :(得分:-1)
可以帮助别人。对于任何语言。主要是圆形功能的技巧。
roundedMinutes = yourRoundFun(Minutes / interval) * interval
E.g。间隔可以是5分钟,10分钟,15分钟,30分钟。 然后四舍五入的分钟可以重置为相应的日期。
yourDateObj.setMinutes(0)
yourDateObj.setMinutes(roundedMinutes)
如果需要那么
yourDateObj.setSeconds(0)
yourDateObj.setMilliSeconds(0)
简单?