Как округлить время до ближайшего четверти часа в JavaScript? - PullRequest
44 голосов
/ 11 февраля 2011

Например:

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

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

Должно быть довольно просто.Но все, что я смог сделать, это длинный, не очень хороший код для решения проблемы.Мой разум просто опустел.

С уважением

Ответы [ 6 ]

85 голосов
/ 11 февраля 2011

Учитывая, что у вас есть часы и минуты в переменных (в противном случае вы можете получить их из экземпляра Date в любом случае, используя 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). // ----

10 голосов
/ 13 февраля 2014

Эта функция округляет время до ближайшего четверти часа.

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;
}
6 голосов
/ 30 января 2018

со строкой времени

Вот метод, который округляет временную строку, подобную представленной вами.Например, "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
6 голосов
/ 11 февраля 2011

Код здесь немного многословен, но я уверен, что вы увидите, как можно объединить строки, чтобы сделать это короче. Я оставил это так, чтобы ясно показать шаги:

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);
0 голосов
/ 04 ноября 2018

Существует пакет NPM @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
0 голосов
/ 03 октября 2015

Может помочь другим. Для любого языка. В основном трюк с круглой функцией.

roundedMinutes = yourRoundFun(Minutes / interval) * interval

например. Интервал может составлять 5 минут, 10 минут, 15 минут, 30 минут. Затем округленные минуты могут быть сброшены на соответствующую дату.

yourDateObj.setMinutes(0) 
yourDateObj.setMinutes(roundedMinutes)

также при необходимости

yourDateObj.setSeconds(0) 
yourDateObj.setMilliSeconds(0) 

Simple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...