web-dev-qa-db-ja.com

Moment.js:日付間の日付

特定の日付が2つの日付の間にあるかどうかをMoment.jsで検出しようとしています。バージョン2.0.0以降、Timは日付比較のためにisBefore()isAfter()を追加しました。

isBetween()メソッドがないので、これはうまくいくと思いました:

var date = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");


if (date.isBefore(endDate) && date.isAfter(startDate) || (date.isSame(startDate) || date.isSame(endDate)) ) { alert("Yay!"); } else { alert("Nay! :("); }

これを行うにはもっと良い方法があるはずだと確信しています。何か案は?

モーメントプラグインの1つ -> moment-range を使用して、日付範囲を処理できます。

var startDate = new Date(2013, 1, 12)
  , endDate   = new Date(2013, 1, 15)
  , date  = new Date(2013, 2, 15)
  , range = moment().range(startDate, endDate);

range.contains(date); // false
74
Lukasz Koziara

バージョン2.9 +にはisBetween関数がありますが、排他的です:

var compareDate = moment("15/02/2013", "DD/MM/YYYY");
var startDate   = moment("12/01/2013", "DD/MM/YYYY");
var endDate     = moment("15/01/2013", "DD/MM/YYYY");

// omitting the optional third parameter, 'units'
compareDate.isBetween(startDate, endDate); //false in this case

包括的な回避策があります...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

...これは論理的に同等です
!(x.isBefore(a) || x.isAfter(b))


バージョン2.13では、isBetween関数に4番目のオプションパラメーターinclusivityがあります。

次のように使用します。

target.isBetween(start, finish, 'days', '()') // default exclusive
target.isBetween(start, finish, 'days', '(]') // right inclusive
target.isBetween(start, finish, 'days', '[)') // left inclusive
target.isBetween(start, finish, 'days', '[]') // all inclusive

考慮すべきその他のユニット:years, months, days, hours, minutes, seconds, milliseconds

注:ユニットは引き続きオプションです。 nullを3番目の引数として使用して、単位を無視します。この場合、ミリ秒がデフォルトの粒度です。

公式ドキュメントにアクセス

224
ThisClark

使用できます

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);

または

moment().isBetween(moment-like, moment-like);

こちらをご覧ください: http://momentjs.com/docs/#/query/

19
Vijay Maheriya

私はそれを信じます

if (startDate <= date && date <= endDate) {
  alert("Yay");
} else {
  alert("Nay! :("); 
}

あまりにも動作します...

15
Tiele Declercq

皆さん、朗報です。isBetween関数があります!ライブラリを更新してください;)

http://momentjs.com/docs/#/query/is-between/

13
Luna

Moment.isBetween関数の4番目のパラメーター(包括性)を使用してください。例:

var startDate = moment("15/02/2013", "DD/MM/YYYY");
var endDate = moment("20/02/2013", "DD/MM/YYYY");

var testDate = moment("15/02/2013", "DD/MM/YYYY");

testDate.isBetween(startDate, endDate, 'days', true); // will return true
testDate.isBetween(startDate, endDate, 'days', false); // will return false
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

論理的に同じです

if (!(date.isBefore(startDate) || date.isAfter(endDate)))

これにより、数行のコードと(場合によっては)メソッド呼び出しが節約されます。

これを1回または2回だけ行いたい場合は、プラグイン全体を取り込むよりも簡単かもしれません。

5
Jamie Humphries

モーメントjsのドキュメントごとに、

Rob Dawsonによって作成されたPrecise Rangeプラグインがあり、日付/時間範囲の正確で人間が読める表現、urlを表示するために使用できます: http://codebox.org.uk/pages/moment-date-範囲プラグイン

moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds

moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days
1
Mohammed Safeer