momentjs 瞬間を最も近い分に切り上げる/切り下げるにはどうすればよいですか?
docs をチェックしましたが、この方法はないようです。
文字列を最も近い分に丸めたくないので、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
は、期待どおりの結果をもたらしません。
roundTo feature は、将来のリリースになる可能性があります。
例:
moment().roundTo('minute', 15); // output: 12:45
moment().roundTo('minute', 15, 'down'); // output: 12:30
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
簡単です。他の多くの人が述べているように、単に 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
私はこの同じ質問を探していて、より良い解決策を見つけました: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/
より正確な答え:
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
このソリューションは私のために働いた。
function round_up_to_nearest_hour(date = new Date()) {
return moment(date).add(59, 'minutes').startOf('hour').toDate();
}
ちょうど別の可能性:
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)