向上/向下舍入到最近的分钟

时间:2013-07-17 04:37:26

标签: javascript time momentjs

如何将momentjs时刻向上/向下舍入到最近的分钟?

我检查了docs,但似乎没有这方法。

请注意,我不希望将字符串四舍五入到最接近的分钟,我希望返回moment(或者在适当的位置修改,也可以。)我不想转换为字符串,也不想转换回来。

感谢。


根据要求,这里有一些代码:

var now = new moment(new Date());

if (now.seconds() > 0) {
    now.add('minutes', -1);
}

now.seconds(0);

正如你所看到的,我已经设法在这里手动完成了这一刻,但它似乎相当hacky。在一种更优雅的方式实现这一目标之后。

13 个答案:

答案 0 :(得分:69)

要向上舍入,您需要添加一分钟然后round it down。要向下舍入,只需使用startOf方法。

请注意使用三元运算符来检查时间是否应该舍入(例如,,点上的13:00:00不需要舍入)。

向上/向下舍入到最近的分钟

var m = moment('2017-02-17 12:01:01');
var roundDown = m.startOf('minute');
console.log(roundDown.toString()); // outputs Tue Feb 17 2017 12:01:00 GMT+0000

var m = moment('2017-02-17 12:01:01');
var roundUp = m.second() || m.millisecond() ? m.add(1, 'minute').startOf('minute') : m.startOf('minute');
console.log(roundUp.toString());  // outputs Tue Feb 17 2017 12:02:00 GMT+0000

向上/向下舍入到最近的小时

var m = moment('2017-02-17 12:59:59');
var roundDown = m.startOf('hour');
console.log(roundDown.toString()); // outputs Tue Feb 17 2017 12:00:00 GMT+0000

var m = moment('2017-02-17 12:59:59');
var roundUp = m.minute() || m.second() || m.millisecond() ? m.add(1, 'hour').startOf('hour') : m.startOf('hour');
console.log(roundUp.toString());  // outputs Tue Feb 17 2017 13:00:00 GMT+0000

答案 1 :(得分:19)

部分答案:

向下舍入到最接近的时刻:

var m = moment();
m.startOf('minute');

然而,向上舍入的等价物endOf并没有给出预期的结果。

答案 2 :(得分:11)

roundTo feature可以使其成为未来版本。

示例:

moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30

答案 3 :(得分:11)

可以通过添加半小时然后运行.startOf('hour')来实现四舍五入到最接近的小时。任何时间测量都是一样的。

var now = moment();
// -> Wed Sep 30 2015 11:01:00
now.add(30, 'minutes').startOf('hour'); // -> Wed Sep 30 2015 11:31:00
// -> Wed Sep 30 2015 11:00:00

var now = moment();
// -> Wed Sep 30 2015 11:31:00
now.add(30, 'minutes').startOf('hour'); // -> Wed Sep 30 2015 12:01:00
// -> Wed Sep 30 2015 12:00:00

答案 4 :(得分:6)

向下舍入

易。正如许多其他人所说,只需使用Moment.startOf

var roundDown = moment('2015-02-17 12:59:59').startOf('hour');
roundDown.format('HH:mm:SS'); // 12:00:00

重要的是,这也可以按预期工作:

var roundDown = moment('2015-02-17 12:00:00').startOf('hour');
roundDown.format('HH:mm:SS'); // 12:00:00

向上舍入

稍微有些棘手,如果我们想要使用适当的ceiling function进行整理:例如,当按小时向上舍入时,我们希望12:00:00向上舍入到12:00:00

这不起作用

var roundUp = moment('2015-02-17 12:00:00').add(1, 'hour').startOf('hour');
roundUp.format('HH:mm:SS'); // ERROR: 13:00:00

解决方案

function roundUp(momentObj, roundBy){
  if (momentObj.millisecond() != 1){
    momentObj.subtract(1,'millisecond');
  }
  return momentObj.add(1, roundBy).startOf(roundBy);
}


var caseA = moment('2015-02-17 12:00:00');
roundUp(caseA, 'minute').format('HH:mm:SS'); // 12:00:00

var caseB = moment('2015-02-17 12:00:00.001');
roundUp(caseB, 'minute').format('HH:mm:SS'); // 12:01:00

var caseC = moment('2015-02-17 12:00:59');
roundUp(caseC, 'minute').format('HH:mm:SS'); // 12:01:00

答案 5 :(得分:4)

更准确的答案:

t.add(30, 'seconds').startOf('minute')

案例1:如果秒数<1,则向下舍入。 30

t = moment(); //12:00:05
t.add(30, 'seconds').startOf('minute') //12:00:00

案例2:如果秒> = 30

,则向上舍入
t = moment(); //12:00:33
t.add(30, 'seconds').startOf('minute') //12:01:00

答案 6 :(得分:2)

此解决方案对我有用;

function round_up_to_nearest_hour(date = new Date()) {
   return moment(date).add(59, 'minutes').startOf('hour').toDate();
}

答案 7 :(得分:1)

我正在寻找相同的问题,并找到了更好的解决方案: 在diff()函数中使用第三个参数:

moment("2019-05-02 17:10:20").diff("2019-05-02 17:09:30","minutes",true)

通过将第三个参数设置为true,您将获得原始值作为响应,您可以使用Math.round()自行舍入

请参阅JSFiddle: https://jsfiddle.net/2wqs4o0v/3/

答案 8 :(得分:0)

另一种可能性:

var now = moment();
// -> Wed Sep 30 2015 11:57:20 GMT+0200 (CEST)
now.add(1, 'm').startOf('minute');
// -> Wed Sep 30 2015 11:58:00 GMT+0200 (CEST)

答案 9 :(得分:0)

到目前为止最简单的解决方案:

function floor(time, floorBy = 'minute') {
  return time.startOf(floorBy);
}

function ceil(time, ceilBy = 'minute') {
  return time.subtract(1, 'millisecond').add(1, ceilBy).startOf(ceilBy);
}

// The solution is above. The code below is an optional test:

console.log(
  floor(moment('2019-01-01 12:00:00.000')).format('H:mm:ss.SSS') === '12:00:00.000',
   ceil(moment('2019-01-01 12:00:00.000')).format('H:mm:ss.SSS') === '12:00:00.000',
  floor(moment('2019-01-01 12:00:00.001')).format('H:mm:ss.SSS') === '12:00:00.000',
   ceil(moment('2019-01-01 12:00:00.001')).format('H:mm:ss.SSS') === '12:01:00.000',
  floor(moment('2019-01-01 12:15:16.876'), 'hour'  ).format('H:mm:ss.SSS') === '12:00:00.000',
   ceil(moment('2019-01-01 12:15:16.876'), 'hour'  ).format('H:mm:ss.SSS') === '13:00:00.000',
  floor(moment('2019-01-01 12:59:59.999'), 'second').format('H:mm:ss.SSS') === '12:59:59.000',
   ceil(moment('2019-01-01 12:59:59.999'), 'second').format('H:mm:ss.SSS') === '13:00:00.000',
  floor(moment('2019-01-01 12:00:00.025'), 'ms'    ).format('H:mm:ss.SSS') === '12:00:00.025',
   ceil(moment('2019-01-01 12:00:00.025'), 'ms'    ).format('H:mm:ss.SSS') === '12:00:00.025'
);
<script src="//cdn.jsdelivr.net/npm/moment@2.24.0/min/moment.min.js"></script>

答案 10 :(得分:0)

更好(且简单)的方法是 -

moment('2021-07-22 14:56:58')
        .startOf('hour')
        .add(1, 'hour')
        // optional: .format('MMMM D, YYYY (h:mm A)')
//output: July 22, 2021 (3:00 PM)

答案 11 :(得分:0)

四舍五入到下一小时

一个简单的方法是 -

moment('2021-07-22 14:56:58')
        .startOf('hour')
        .add(1, 'hour')
        // optional: .format('MMMM D, YYYY (h:mm A)')
//output: July 22, 2021 (3:00 PM)

答案 12 :(得分:-2)

将此文件复制到您的项目中:

// copied from here https://github.com/WebDevTmas/moment-round/blob/1d20ce5d338529c76da8439fe594cc6984505810/src/moment-round.js and modified
import moment from 'moment';

moment.fn.round = function(precision, key, direction='round') {
    let keys = ['Hours', 'Minutes', 'Seconds', 'Milliseconds'];
    let maxValues = [24, 60, 60, 1000];

    // Capitalize first letter
    key = key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();

    // make sure key is plural
    if(key.indexOf('s', key.length - 1) === -1) {
        key += 's';
    }
    let value = 0;
    let rounded = false;
    let subRatio = 1;
    let maxValue;
    for(let i=0; i<keys.length; ++i) {
        let k = keys[i];
        if(k === key) {
            value = this._d['get' + key]();
            maxValue = maxValues[i];
            rounded = true;
        } else if(rounded) {
            subRatio *= maxValues[i];
            value += this._d['get' + k]() / subRatio;
            this._d['set' + k](0);
        }
    }

    value = Math[direction](value / precision) * precision;
    value = Math.min(value, maxValue);
    this._d['set' + key](value);

    return this;
};

moment.fn.ceil = function(precision, key) {
    return this.round(precision, key, 'ceil');
};

moment.fn.floor = function(precision, key) {
    return this.round(precision, key, 'floor');
};

导入它:

import Moment from 'moment';
import '../../moment-round';

假设您正在使用CommonJS / Babel / Webpack。