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

bgu*_*uiz 51 javascript time momentjs

你如何四舍五入/圆下来momentjs时刻最接近的分钟数?

我检查了文档,但似乎没有这方法.

请注意,我不希望将字符串四舍五入到最接近的分钟,我想要moment返回(或修改到位,也可以).我不想转换为字符串,转换回来也是如此.

谢谢.


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

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

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

now.seconds(0);
Run Code Online (Sandbox Code Playgroud)

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

Liy*_*ali 80

要向上舍入,您需要添加一分钟然后将其向下舍入.要向下舍入,只需使用该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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 这种舍入方法不是一个合适的[天花板功能](https://en.wikipedia.org/wiki/Floor_and_ceiling_functions):`12:00:00`如果向上舍入到小时给出`13:00:00` .有关详细信息和可能的解决方法,请参阅[我的回答](http://stackoverflow.com/a/37685886/2701578). (4认同)
  • @KirillGamazkov [endOf](http://momentjs.com/docs/#/manipulated/end-of/) 函数创建类似“2019-10-11T18:59:59.999”的值,您可能希望将其设置为“2019-” 10-11T19:00:00.000”。 (3认同)

bgu*_*uiz 22

部分答案:

要舍入到最近时刻分钟:

var m = moment();
m.startOf('minute');
Run Code Online (Sandbox Code Playgroud)

但是,相当于四舍五入endOf,并不能完全给出预期的结果.

  • 对于四舍五入可以使用`m.add(30,'seconds').startOf('minute')` (14认同)
  • @TommiKomulainen你建议将做四舍五入为最接近的分钟,而这正是该任择议定书要求的方法.请参阅下面的答案. (3认同)

mar*_*rds 13

通过添加半小时然后运行.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
Run Code Online (Sandbox Code Playgroud)


Tri*_*ran 12

roundTo功能可以使之成为未来的版本.

例子:

moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30
Run Code Online (Sandbox Code Playgroud)

  • 可能不会.公关被关闭了.但是有一个[插件](https://github.com/WebDevTmas/moment-round). (2认同)

rem*_*ika 9

四舍五入

简单.正如许多其他人所说,只需使用Moment.startOf:

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

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

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

围捕

稍微棘手,如果我们想圆了一个合适的天花板功能:例如,按小时围捕的时候,我们要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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


viv*_*viv 5

更准确的答案:

t.add(30, 'seconds').startOf('minute')
Run Code Online (Sandbox Code Playgroud)

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

t = moment(); //12:00:05
t.add(30, 'seconds').startOf('minute') //12:00:00
Run Code Online (Sandbox Code Playgroud)

案例 2:如果秒数 >= 30,则向上舍入

t = moment(); //12:00:33
t.add(30, 'seconds').startOf('minute') //12:01:00
Run Code Online (Sandbox Code Playgroud)