Округлить/округлить минутный момент до ближайшей минуты
Как вы округляете мгновение до ближайшей минуты?
Я проверил документы, но, кажется, нет способа для этого.
Обратите внимание, что я не хочу, чтобы строка была округлена до ближайшей минуты, я хочу вернуть moment
(или изменить на месте, либо в порядке). Я предпочитаю не преобразовывать в строку, а преобразовывать обратно тоже.
Благодарю.
Как и просили, вот код:
var now = new moment(new Date());
if (now.seconds() > 0) {
now.add('minutes', -1);
}
now.seconds(0);
как вы видите, мне удалось вручную округлить момент здесь, но это кажется довольно хакерским. Просто после более элегантного способа сделать это.
Ответы
Ответ 1
Чтобы округлить, вам нужно добавить минута, а затем округлить ее. Чтобы округлить, просто используйте метод 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
Ответ 2
Частичный ответ:
Чтобы округлить до ближайшей минуты:
var m = moment();
m.startOf('minute');
Однако эквивалент округления endOf
не дает ожидаемого результата.
Ответ 3
Функция roundTo может превратить ее в будущую версию.
Примеры:
moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30
Ответ 4
Округление до ближайшего часа может быть достигнуто добавлением полчаса, а затем запустить .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
Ответ 5
Округление вниз
Легко. Как утверждают многие другие, просто используйте 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){
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
Ответ 6
Более точный ответ:
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
Ответ 7
Я искал этот же вопрос и нашел лучшее решение: используйте третий параметр в функции 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
Это решение сработало для меня;
function round_up_to_nearest_hour(date = new Date()) {
return moment(date).add(59, 'minutes').startOf('hour').toDate();
}
Ответ 9
Еще одна возможность:
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)
Ответ 10
Самое простое решение на данный момент:
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/[email protected]/min/moment.min.js"></script>
Ответ 11
Скопируйте этот файл в свой проект:
// 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.