Круглое время момента 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");
Ответы
Ответ 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);
ОБНОВЛЕНИЕ: Спасибо Измаил Сибиси за указание на ошибку в моем коде! :)