web-dev-qa-db-ja.com

momentjsのモーメントを最も近い分に切り上げ/切り捨てます

momentjs 瞬間を最も近い分に切り上げる/切り下げるにはどうすればよいですか?

docs をチェックしましたが、この方法はないようです。

文字列を最も近い分に丸めたくないので、momentが返される(またはその場で修正される、どちらでもいい)ことに注意してください。私は文字列に変換する必要はなく、また変換する必要もありません。

ありがとう。


要求されたように、ここにいくつかのコードがあります:

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

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

now.seconds(0);

ご覧のとおり、ここでは手動で切り捨てることができましたが、かなりハックのようです。これを達成するためのよりエレガントな方法の直後。

50
bguiz

切り上げるには、分を追加してから 切り捨て にする必要があります。切り捨てるには、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
77
Liyali

部分的な答え:

最も近い瞬間に切り捨てるには:

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

ただし、切り上げに相当するendOfは、期待どおりの結果をもたらしません。

21
bguiz

roundTo feature は、将来のリリースになる可能性があります。

例:

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

30分を追加してから.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
12
martinedwards

切り捨て

簡単です。他の多くの人が述べているように、単に 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:0012: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
8
remeika

私はこの同じ質問を探していて、より良い解決策を見つけました:diff()関数で3番目のパラメーターを使用します:

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

3番目のパラメーターをtrueに設定すると、Math.round()を使用して自分で丸めることができる応答として生の値を取得できます

JSFiddleを参照してください: https://jsfiddle.net/2wqs4o0v/3/

4
Sjoerd Loeve

より正確な答え:

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
4
Vivek RC

このソリューションは私のために働いた。

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

ちょうど別の可能性:

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)
0
Manu