Подтвердить что ты не робот

Круглое время момента time.js до ближайшего 30-минутного интервала

Я пытался округлить объект времени moment.js до следующего ближайшего 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");
4b9b3361

Ответ 1

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>

Ответ 2

На основе ответов и комментариев @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");

Ответ 3

Общее решение:

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 на Math.round или Math.floor, если вы хотите другой способ округления значения.

Ответ 4

Вы можете сделать это с помощью простого предложения if-else:

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

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

Ответ 5

хотя на вопрос был дан ответ, я бы тоже хотел поделиться своим решением.

var moment = require('moment');

const roundToNearestXXMinutes = (start, roundTo) => {
    let remainder = roundTo - (start.minute()+ start.second()/60) % roundTo;

    remainder = (remainder >  roundTo/2) ? remainder = -roundTo + remainder : remainder;
    const changedDate = moment(start).add(remainder, "minutes" ).seconds(0).format("DD.MM.YYYY HH:mm:ss");    
}

roundToNearestXXMinutes(moment(), 15);

ОБНОВЛЕНИЕ: Спасибо Измаил Сибиси за указание на ошибку в моем коде! :)