75

インスタンスを使用してDate()、時間を最も近い5分に丸めるにはどうすればよいですか?

例:午後4時47分であれば、時刻は午後4時45分に設定されます。

4

10 に答える 10

248

Dateすでにオブジェクトがある場合、これは非常に簡単です。

var coeff = 1000 * 60 * 5;
var date = new Date();  //or use any other date
var rounded = new Date(Math.round(date.getTime() / coeff) * coeff)
于 2012-05-28T19:13:18.203 に答える
18

最も近いx分に丸める

これは、日付オブジェクトを最も近いx分に丸めるメソッドです。日付を指定しない場合は、現在の時刻を丸めます。

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(5, new Date()); // 2018-01-26T00:45:00.000Z

// Get current time rounded to 30 minutes
getRoundedDate(30); // 2018-01-26T00:30:00.000Z
于 2018-01-26T00:28:53.080 に答える
13

ES6と部分的な機能により、エレガントになります。最も近いものに丸める必要があるか、常に下/上に丸める必要があるかを選択します。

const roundTo = roundTo => x => Math.round(x / roundTo) * roundTo;    
const roundDownTo = roundTo => x => Math.floor(x / roundTo) * roundTo;
const roundUpTo = roundTo => x => Math.ceil(x / roundTo) * roundTo;

const roundTo5Minutes = roundTo(1000 * 60 * 5);
const roundDownTo5Minutes = roundDownTo(1000 * 60 * 5);
const roundUpTo5Minutes = roundUpTo(1000 * 60 * 5);

const now = new Date();
const msRound = roundTo5Minutes(now)
const msDown = roundDownTo5Minutes(now)
const msUp = roundUpTo5Minutes(now)

console.log(now);
console.log(new Date(msRound));
console.log(new Date(msDown));
console.log(new Date(msUp));

于 2019-06-05T13:53:21.280 に答える
4

答えが少し遅れていることは知っていますが、誰かを助けることができるかもしれません。次のように議事録を取る場合

new Date().getMinutes()

あなたは最後の5分を取ることができます

new Date().getMinutes() - (new Date().getMinutes()%5)
于 2014-11-16T12:25:14.177 に答える
3

おそらく効率は劣りますが、別の方法があります。

debug('Current timestamp:', timestamp);

timestamp.setMilliseconds(0);
timestamp.setSeconds(0);
timestamp.setMinutes(Math.round(timestamp.getMinutes() / 5) * 5);

debug('Rounded timestamp:', timestamp);
Current timestamp: 2019-10-22T09:47:17.989Z
Rounded timestamp: 2019-10-22T09:45:00.000Z
于 2019-10-22T09:49:40.960 に答える
1

このメソッドを使用して、純粋なJSを使用して次の5分のサイクルを取得します

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(5 * 60 * 1000)); // pass in milliseconds

于 2020-05-06T17:06:24.663 に答える
1

Date-fnsに、日付の分を丸める関数が追加されました。https://date-fns.org/v2.21.3/docs/roundToNearestMinutesを参照してください

const roundToNearestMinutes = require('date-fns/roundToNearestMinutes')
console.log(roundToNearestMinutes(new Date(), {nearestTo: 5}));
// e.g. 2021-05-19T22:45:00.000Z
于 2021-05-19T22:47:04.277 に答える
0

最近、日付を時間枠に丸める非常に効率的な方法を見つけました

要するに:

// minutes
var tf = 15; // 5,10,13,15, 60, - what ever you want
var dt = DateTime.UtcNow;
var minues = dt.TimeOfDay.TotalMinutes; // use TotalMinutes, TotalSecibds, TotalMillisecons  and etc
var roundedMinutes = (minues - (minues%tf));
var roundedDate = dt.Date.AddMinutes(a);

LINQPadで少しテストしました

// minutes
var tf = 15; // 5,10,13,15, 60, - what ever you want
var dt = DateTime.UtcNow;
var minues = dt.TimeOfDay.TotalMinutes;
dt.Dump();
minues.Dump();
(ms%tf).Dump();
var a = (minues - (minues%tf));
a.Dump();
dt.Date.AddMinutes(a).Dump();

出力:

13.07.2018 7:43:58 - current date
463,981443103333 - total mins
13,9814431033333 - rest
450 - rounded minutes value
13.07.2018 7:30:00 - rounded date
于 2018-07-13T07:48:48.067 に答える
0

使用できるNPMパッケージ があります。丸めるインスタンスがあるとする@qc/date-roundDate

import { round } from '@qc/date-round'

const dateIn = ...; // The date to be rounded
const interval = 5 * 60 * 1000; // 5 minutes
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
于 2018-11-04T17:48:30.040 に答える
0

ワンラインソリューション(切り上げまたは切り下げ):

const fixedTime = (isRoundUp ? Math.ceil : Math.floor)(time / 60_000 / minutesRange)) * 60_000 * minutesRange;

// minutesRange: number -> 1, 5, 15, 30, etc // minutes
// isRoundUp: boolean
// time: number // millis
于 2021-02-08T22:05:42.193 に答える