Moment.js:日付間の日付


118

特定の日付が2つの日付の間にあるかどうかをMoment.jsで検出しようとしています。バージョン2.0.0以来、ティムが追加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! :("); }

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


あなたが欲しかったと確信していますか?isBetween || isStart || isEnd
ベルギ2013

ええ、タイプミスがあります、ごめんなさい!
Joel A.Villarreal Bertoldi 2013

回答:


82

モーメントプラグイン -> モーメント範囲のいずれかを使用して、日付範囲を処理できます。

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

1
どのようにプラグインを含めますか?

2
あなたはmomentjsの後に<script src = "/ javascripts / moment-range.js"> </ script>を含めるべきです
Lukasz Koziara '19

53
date.isBetween(startDate、endDate); はるかに簡単で、追加のプラグインを必要としません。
Brendan Nee

moment&moment-Rangeは、範囲の準備中に日付と時刻をフォーマットし、Contains / Within / Overlaps / Intersect / Add / Subtractの日付を比較するオプションを提供します。特別な形式で日付を取得する場合、必要な形式で日付を変換することで配列内の日付範囲を準備でき、比較できます。
Sajjad Ali Khan、2016

277

ではバージョン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.13isBetween機能は、第四のオプションのパラメータを有しています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番目の引数として使用します。この場合、ミリ秒がデフォルトの粒度です。

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


3
ドキュメントに記載されているように、isBetweenが排他的である、ということを念頭に裸
ホアキン・L.ロブレス

x.isBetween(moment(a).subtract(1, 'day'), b)トリックも行うようです。
James Donnelly

@ThisClarkそれは良い回避策です。:私は少数の関数呼び出しと別のお勧めかもしれません!(x.isBefore(a) || x.isAfter(b))
tavnab

どういうexclusive意味ですか?
バットマン

2
@バットマンリスト1、2、3、4、5を検討してください。排他的に、1と5はこのリストの値の間にありません。包括的に、1と5はこのリストの値の間にあります。(右の排他的と同じ)包括左は1を含むが、(左排他的と同じ)ではない5.右込みは5を含んではなく、1
ThisClark


16

私はそれを信じています

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

も動作します...


この計算では常に年は無視されます。たとえば、startDate = '05 -01-2019 '、endDate = '05 -31-2019'、日付を'05 -21-2017 'とすると、結果は "Yay"になりますが、falseです。
Aakash Maurya

1
@AakashMaurya日付ではなく文字列を比較しています。startDate / endDateがstartDate = new Date( "05-01-2019")として定義されていることを確認してください。
Tiele Declercq

13

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

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


2
真実だisBetweenが包括的ではない
Epoc 2015年

4
バージョン2.13.0では、排他性が導入されています。[は値の包含を示します。Aは(除外を示し包含パラメータが使用されている場合、両方の指標が通過しなければならない。。moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratanグプタ

8

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

5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

論理的に同じです

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

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

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


1

モーメントjsのドキュメントに従って、

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.