我试图将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");
我试图将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");
Answers:
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。无论如何,这是一个。
code
30-(start.minute()%30)
.startOf('minute')
,以重置固有日期对象的秒和毫秒。
基于@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
如果你想另一种方式圆值。
function date_round(date, duration) { return moment(Math.floor((+date)/(+duration)) * (+duration)); }
使用像这样date_round(moment(), moment.duration(30, 'minutes'))
您可以通过一个简单的if-else子句来做到这一点:
if(moment().minute()> 30){
var myTime = moment().minute(30).second(0);
}else{
var myTime = moment().minute(0).second(0);
}
round
标题标题中使用了该词,但OP希望具有类似于的内容ceil
。您的解决方案既不提供效果,又提供的效果floor
。
即使问题已得到解答,我也想分享我的解决方案。
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);
编辑:感谢Ishmael Sibisi指出我的代码中的缺陷!:)
下面的代码将当前时间四舍五入为最近的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