圆形moment.js对象时间到最近的30分钟间隔

时间:2014-08-15 09:02:06

标签: javascript momentjs

我试图绕过这一刻。时间对象到下一个最近的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");

8 个答案:

答案 0 :(得分:77)



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>
&#13;
&#13;
&#13;

百万种方式来做到这一点。你真的不需要moment.js。无论如何,这是一个。

答案 1 :(得分:40)

基于@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");

答案 2 :(得分:30)

通用解决方案:

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.ceilMath.round更改Math.floor

答案 3 :(得分:3)

您可以通过简单的if-else子句来完成:

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

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

答案 4 :(得分:3)

您可以使用两个if来做到这一点:

// 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});

答案 5 :(得分:2)

就我而言,我想要的是类似的东西

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 回答的改编

答案 6 :(得分:0)

即使问题已经得到解答,我也想分享我的解决方案。

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);

答案 7 :(得分:0)

下面的代码将当前时间四舍五入为最近的30分钟,并且完美地处理了所有 seconds

    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