2017-03-09 12 views
2

私は、このプログラミングの問題に対する洗練された解決方法があるのだろうかと思っていました。日付/期間が別の日付/期間内にあるかどうかを確認する - より洗練された解決策が可能ですか?

、以下の条件を満たしているイベントの日付があります:

1) it can be 'from' - 'to' 
2) OR it can be 'from' 
    AND (repeating at defined intervals n times OR indefinitely). 
    The interwals can be day/week/month or year 

そのイベントの参加者があります。 (S)彼は彼/彼女が利用できないときに、期間/日付を添付することがあります。

私は、参加者の「使用できない」日付かどうかを確認する必要があり
1) the date can be 'from' - 'to' 
2) the date can be only 'from' 
3) the date can be only 'to' 

- 存在する場合は、 - イベントの日付とどのような方法で重なっています。

今のところ、ホットスポットまたは条件です。コードが終了していない、私はさらに追加する必要があります。言語 - PHP。私は日付を比較するためのDateTime PHPオブジェクトを使用しています。

これは何らかの形で改善することができますか、この場合、条件は唯一の方法ですか?私は、正確なコード、単なるアイデアは必要ありません。

if($event->recurring === '0') { 
     // Non recurring event 
     if($eventEndValid && $userFromValid && $userToValid) { $user->available = ($userFrom < $eventStart && $userTo < $eventStart) || ($userFrom >= $eventEnd && $userTo > $eventEnd); } 
     else if($userFromValid && $userToValid) { $user->available = ($userFrom < $eventStart) && ($userTo <= $eventStart); } 
     else if(!$eventEndValid && !$userToValid) { $user->available = false; } 
     else if(!$eventEndValid && !$userFromValid) { $user->available = $userTo <= $eventStart; } 
     else if($eventEndValid && !$userToValid) { $user->available = $userFrom >= $eventEnd; } 
     else if($eventEndValid && !$userFromValid) { $user->available = $userTo <= $eventStart; } 
    } else { 
     $dIntStr = 'P'; 
     switch($event->recurring_frequency) { 
      case '1': 
       $dIntStr .= '1D'; 
       break; 
      case '2': 
       $dIntStr .= '1W'; 
       break; 
      case '3': 
       $dIntStr .= '1M'; 
       break; 
      case '4': 
       $dIntStr .= '1Y'; 
       break; 
     } 
     // Case 1 
     if(!$userToValid) { $user->available = false; } 
     if((!$userFromValid && $userToValid)) { $user->available = $userTo <= $eventStart; } 

     // Case 2 - number of intervals is unlimited 
     if($event->recurring_frequency === '0') { 
      if($userToValid && $userTo <= $eventStart) { $user->available = true; } 
      else if($userTo > $eventStart) { 
       // If unavailability is between the intervals then true 
       $user->available = true; 
      } 
      else { $user->available = false; } 
     } 


     // Case 2 - number of intervals is limited 
     $dateInterval = DateInterval($dIntStr); 
     if($event->recurring_frequency === '0') { 

     } 


    } 

答えて

1

通常、機能を使用してコードを短縮することができます。しかし、私はクラスは、このために、より適していると思うだろう:

class DateRange{ 
    public $from, $to; 

    public function inBetween($outer){ 
    return $this->from >= $outer->from && $this->to <= $outer->to; 
    } 

    function __construct($from, $to){ 
    if($a = $from->getTimestamp() == $b = $to->getTimestamp()){ 
     throw new \Exception('A period cannot be the same time'); 
    } else { 
     if($a < $b){ 
     $this->from = $a; 
     $this->to = $b; 
     } else { 
     $this->from = b; 
     $this->to = $a; 
     } 
    } 
    } 
} 

$today = new Datetime(); 
$lastyear = (new Datetime())->modify('-1 year'); 
$from  = (new Datetime())->modify('-9 month'); 

$outer = new DateRange($lastyear, $today); 
$inner = new DateRange($from, $today); 

if($inner->inBetween($outer)){ 
    echo 'it is'; 
} else { 
    echo 'it isnt'; 
} 

あなたがこの方法を合うようにあなたがinBetween()のような複数のメソッドを追加することができます。

+0

ありがとうございました。このアプローチは本当にうまくいった。最初は、新しいクラスを作成するにはあまりにも多くのコードが必要になると思っていましたが、これは本当のことですが、コードは読みやすく保守しやすくなりました。コード:[DateRangeHelper class](https://bitbucket.org/al2357/php_snippets/src/d947a38689605ca58d8da3e6a1401b7e37659630/DateRangeHelper/DateRangeHelper.php?at=master&fileviewer=file-view-default) – Alan

関連する問題