Округление времени объекта current.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");
9 ответов
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 на самом деле. Во всяком случае, здесь один.
На основе ответов и комментариев @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");
Общее решение:
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
если вы хотите еще один способ округлить значение.
Вы можете сделать это с помощью простого предложения if-else:
if(moment().minute()> 30){
var myTime = moment().minute(30).second(0);
}else{
var myTime = moment().minute(0).second(0);
}
Вы можете сделать это с помощью двух условий:
// Current date
let now = moment();
// Getting hour and minute
let hour = now.hour();
let minute = now.minute();
// Rounding minute on 30 mins interval
if(minute <= 30) now.set({minute: 30});
if(minute > 30) now.set({hour: hour + 1, minute: 0});
Однострочное решение
moment().add( moment().minute() > 30 && 1 , 'hours').minutes( moment().minute() <= 30 ? 30 : 0).format("hh:mm a")
Рабочий пример:
В моем случае я вместо этого хотел что-то вроде
04-28-2021 20:00 => 04-28-2021 20:00
04-28-2021 20:30 => 04-28-2021 20:30
04-28-2021 20:11 => 04-28-2021 20:00
04-28-2021 20:35 => 04-28-2021 20:30
так что функция ниже сработала
function toNearest30Minutes(date) {
const start = moment(date)
let remainder: number
const elapse = start.minute() % 30
if (elapse === 0) {
return moment(date).format()
} else {
remainder = 30 - elapse
return moment(start).add(remainder, "minutes").format()
}
}
Вышеупомянутая функция - это просто адаптация ответа @jtromans выше.
Хотя на вопрос был дан ответ, я бы тоже хотел поделиться своим решением.
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);
Приведенный ниже код округляет текущее время до ближайших 30 минут, а также безупречно обрабатывает любые последующие секунды.
var moment = require('moment')
var main = Date.now() //2020-03-13T23:17:34+01:00
var mainFormat = moment(main)
var secs = mainFormat.second()
var justMinutes = mainFormat.subtract(secs, 'seconds')
var remainder = 30 - (justMinutes.minute() % 30);
var dateTime = moment(justMinutes).add(remainder, 'minutes')
var final = dateTime.format()
console.log(final)
//2020-03-13T23:20:00+01:00