如何在JavaScript中将时间缩短到最接近的四分之一小时?

时间:2011-02-11 11:02:39

标签: javascript time

例如:

Given time: 08:22 => Rounded to: 08:15

Given time: 08:23 => Rounded to: 08:30

应该很简单。但我能够生成的只是冗长而不是很好的代码来解决这个问题。我的思绪一片空白。

此致

11 个答案:

答案 0 :(得分:84)

考虑到变量中有小时和分钟(如果不是,您可以使用Date实例functionsDate实例获取它们:

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) 

简单?