20

Xの日付範囲がYの日付範囲の間にあるかどうかを確認するためにIFチェックをしようとしています。しかし、正しい時間に正しい true/false を返していません:

var startdate = new Date('06/06/2013');
var enddate = new Date('06/25/2013');
var startD = new Date('06/08/2013');
var endD = new Date('06/18/2013');

if(startD >= startdate || endD <= enddate) {
  return true;
} else {
  return false;
}

これは機能しますが、変更startdateする06/09/2013enddate06/17/2013機能するはずなのに機能しなくなります。

startdatewas06/07/2013enddatewasの場合でも機能するはずですが06/15/2013、機能しません。何かご意見は?

4

4 に答える 4

39

完全な封じ込めを検出しようとしている場合、それはかなり簡単です。(また、条件はとにかくブール値であるため、明示的な必要はありませreturn true/falseん。それを返すだけです)

// Illustration:
//
// startdate                          enddate
// v                                        v
// #----------------------------------------#
//
//         #----------------------#
//         ^                      ^
//         startD              endD
return startD >= startdate && endD <= enddate;

オーバーラップ テストはもう少し複雑です。true順序に関係なく、2 つの日付範囲が重複する場合、次のように返されます。

// Need to account for the following special scenarios
//
// startdate     enddate
// v                v
// #----------------#
//
//         #----------------------#
//         ^                      ^
//         startD              endD
//
// or
//
//              startdate        enddate
//                 v                v
//                 #----------------#
//
//         #------------------#
//         ^                  ^
//       startD              endD
return (startD >= startdate && startD <= enddate) ||
       (startdate >= startD && startdate <= endD);

@Bergiの答えは、2つの日付範囲の開始/終了ペアをチェックするだけであるという点で、おそらくよりエレガントです。

于 2013-06-25T18:17:05.770 に答える
23

それらがいずれかの日と重なっているかどうかを確認するには、次を使用します

if (endD >= startdate && startD <= enddate)

これはと同等です

if ( !(endD < startdate || startD > enddate)) // not one after the other
于 2013-06-25T18:16:51.613 に答える
15

あなたの例では、新しい日付は両方とも範囲外です。

日付範囲に重複があるどうかを確認する場合は、次を使用します。

return (endD >= startdate && startD <= enddate);
于 2013-06-25T18:14:12.580 に答える