web-dev-qa-db-ja.com

moment.jsオブジェクトの時間を最も近い30分間隔に丸めます

私はmoment.jsのtimeオブジェクトを次に近い30分間隔に丸めようとしていました。しかし、私の論理は間違っているように見えます。

例:

10:13am -> 10:30am
11:45am -> 12:00pm

ここに私の現在のコードがあります

start = moment();
minuteReminder = start.minute() % 30;
start.add(minuteReminder, 'minutes');
start.format("D YYYY, h:mm:ss a");
50
const start = moment('2018-12-08 09:42');
const remainder = 30 - (start.minute() % 30);
 
const dateTime = moment(start).add(remainder, "minutes").format("DD.MM.YYYY, h:mm:ss a");

console.log(dateTime);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>

これを行うための無数の方法。あなたはmoment.jsを本当に必要としません。とにかく、ここに1つあります。

83
jtromans

@Voluneと@Cablooの回答とコメントに基づいて、更新されたバージョンは次のようになります。

function round(date, duration, method) {
    return moment(Math[method]((+date) / (+duration)) * (+duration)); 
}

これは次のように使用できます:

var date = moment();
var roundedDate = round(date, moment.duration(15, "minutes"), "ceil");
47
janhartmann

一般的なソリューション:

var ROUNDING = 30 * 60 * 1000; /*ms*/
start = moment();
start = moment(Math.ceil((+start) / ROUNDING) * ROUNDING);
start.format("D YYYY, h:mm:ss a");

ROUNDINGを30分から必要なものに変更し、Math.ceil by Math.roundまたはMath.floor値を丸める別の方法が必要な場合。

30
Volune

簡単なif-else節でそれを行うことができます:

            if(moment().minute()> 30){
                var myTime = moment().minute(30).second(0);

            }else{
                var myTime = moment().minute(0).second(0);
            }
3
Aida Nowzari

質問に回答しましたが、解決策も共有したいと思います。

var moment = require('moment');

const roundToNearestXXMinutes = (dateTime, roundTo) => {
    let remainder = roundTo - (start.minute()+ start.second()/60) % roundTo ;
    //console.log(moment(start).format("DD.MM.YYYY HH:mm:ss"));
    remainder = (remainder >  roundTo/2) ? remainder = -roundTo + remainder : remainder;
    const changedDate = moment(start).add(remainder, "minutes" ).seconds(0).format("DD.MM.YYYY HH:mm:ss");
    //console.log('is changed to');
    //console.log(changedDate);
}

roundToNearestXXMinutes(new Date("October 13, 2014 23:46:00"), 10);