向上舍入/向下舍入一个时刻js 时刻到最接近的分钟
round up/ round down a momentjs moment to nearest minute
如何将 momentjs 时刻四舍五入/四舍五入到最接近的分钟?
我已经检查了文档,但似乎没有一种方法。
请注意,我不希望字符串四舍五入到最接近的分钟,我希望返回一个moment
(或就地修改,两者都很好(。我宁愿不必转换为字符串,也转换回来。
谢谢。
根据要求,下面是一些代码:
var now = new moment(new Date());
if (now.seconds() > 0) {
now.add('minutes', -1);
}
now.seconds(0);
如您所见,我已经设法手动将这里的时刻四舍五入,但这似乎相当笨拙。只是在以更优雅的方式完成此操作之后。
要向上舍入,您需要添加一个分钟,然后将其向下舍入。要向下舍入,只需使用 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
部分答案:
要向下舍入到最接近的时刻分钟:
var m = moment();
m.startOf('minute');
但是,四舍五入的等效项 endOf
并不能完全给出预期的结果。
舍五入到最接近的小时可以通过添加半小时然后运行 .startOf('小时'( 来实现。对于任何时间测量都是相同的。
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
roundTo 功能可能会进入未来的版本。
例子:
moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30
向下舍入
容易。正如许多其他人所说,只需使用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
围捕
稍微棘手一点,如果我们想用适当的上限函数四舍五入:例如,当按小时四舍五入时,我们希望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){
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
更精确的答案:
t.add(30, 'seconds').startOf('minute')
情况 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
我正在寻找同样的问题并找到了更好的解决方案:在函数中使用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/
这个解决方案对我有用;
function round_up_to_nearest_hour(date = new Date()) {
return moment(date).add(59, 'minutes').startOf('hour').toDate();
}
只是另一种可能性:
const 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)
到目前为止最简单的解决方案:
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>
- 浮点0.2+0.1舍入误差
- 谷歌材料图表:停止工具提示舍入
- jQuery - 带有一些数字的表格计算出现奇怪的舍入错误
- 有人可以详细解释这个 JavaScript 十进制舍入函数吗?
- 求和值时出现Javascript舍入问题
- 在追加文本中舍入数字输出
- Infrastics网络货币编辑舍入问题
- Javascript中的自定义舍入数
- 通过JavaScript将数字舍入到0.11的最接近倍数
- 是否可以在 JavaScript 中实现没有舍入问题的任意精度算术
- JavaScript 中的舍入问题
- 如何在不向上舍入的情况下删除尾随小数
- 适用于 IE8 的子像素舍入 JavaScript/jQuery 解决方案,用于具有百分比宽度的表格单元格
- 十进制值会自动舍入
- 将浮点数向上舍入到 javascript 中的下一个整数
- Javascript中的舍入问题
- JavaScript:在 .5 种情况下向下舍入
- 使用 toFixed 对十进制数字进行舍入
- 在javascript中不带舍入的十进制比较
- 向上舍入/向下舍入一个时刻js 时刻到最接近的分钟