it-swarm.com.de

Wie runde ich die Zeit auf die nächste Viertelstunde in JavaScript?

Zum Beispiel:

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

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

Sollte ziemlich einfach sein. Aber alles, was ich produzieren konnte, ist langwieriger, nicht sehr guter Code, um das Problem zu lösen. Mein Verstand ist einfach leer.

Grüße

42
pantarhei

Angenommen, Sie haben Stunden und Minuten in Variablen (andernfalls können Sie sie mit Date Instanz funktionen ) trotzdem von der Date-Instanz erhalten:

var m = (parseInt((minutes + 7.5)/15) * 15) % 60;
var h = minutes > 52 ? (hours === 23 ? 0 : ++hours) : hours;

minuten können auch mit Math.round() berechnet werden:

var m = (Math.round(minutes/15) * 15) % 60;

oder tun Sie es in einem JavaScript-anspruchsvolleren Ausdruck ohne Funktionen:

var m = (((minutes + 7.5)/15 | 0) * 15) % 60;
var h = ((((minutes/105) + .5) | 0) + hours) % 24;

Sie können den jsPerf-Test überprüfen, der zeigt, dass Math.round() das langsamste der drei ist, während das letzte das schnellste ist, da es sich lediglich um einen Ausdruck ohne Funktionsaufrufe handelt (kein Funktionsaufruf, dh Stack-Manipulation), obwohl native Funktionen in Javascript möglicherweise anders behandelt werden VM) . // ---- 

82
Robert Koritnik

Diese Funktion rundet die Uhrzeit auf die nächste Viertelstunde ab.

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;
}
10
Antoine Desbois

Der Code hier ist ein wenig ausführlich, aber ich bin mir sicher, dass Sie sehen werden, wie Sie die Zeilen kombinieren können, um dies zu verkürzen. Ich habe es so gelassen, um die Schritte klar zu zeigen:

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);
6
Lazarus

Mit Zeitzeichenfolge

Hier ist eine Methode, die einen Zeitstring wie den von Ihnen präsentierten rundet. ZB "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"

Mit Stunden und Minuten bereits aufgeteilt

Sie können diese Methode verwenden, wenn Sie die Stunden- und Minutenzeichenfolgen nicht wie in den Beispielshows analysieren müssen

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}

Mit vorhandenem Datumsobjekt

Wenn Sie ein bereits vorhandenes Datumsobjekt auf die nächsten x Minuten aufrunden möchten, können Sie diese Methode verwenden.

Wenn Sie kein Datum angeben, wird die aktuelle Uhrzeit gerundet. In Ihrem Fall können Sie auf die nächsten 15 Minuten aufrunden.

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
5
joshuakcockrell

Teilen Sie durch 9e5 Millisekunden (15 * 60 * 1000), runden Sie und multiplizieren Sie mit 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) )
1
Slai

Es gibt ein NPM-Paket@qc/date-round, das verwendet werden kann. Vorausgesetzt, Sie haben eine Date-Instanz, die gerundet werden soll

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)

Dann können Sie date-fns verwenden, um das Datum zu formatieren

import format from 'date-fns/format';

console.log(format(dateOut, 'HH:mm')) // 24-hr
console.log(format(dateOut, 'hh:mm a')) // 12-hr
0
Danny Hurlburt