2017-09-19 4 views
1

$ now(UTC時)が特定の間隔の前、後または間であるかどうかを確認する必要があります。PHP:日付が期限切れになっていないか確認してください。(終了は真夜中の後でもいいかもしれません)

$ endが深夜の午前0時(例えば、$start = '18:00'$end = '22:00')の場合は問題ありません。

しかし、いくつかのテストの後、$ endが真夜中の後に(そして私の例では!)問題が発生する可能性があります。例えば。 $start = '20:00'および$end = '04:00'である。この場合、$ startは19/09/2017にあり、終了は20/09/2017になります。

これはコードの最初の部分です(一部の関数は、自分で作成したSupportDateクラスのものです)。チェックを反転:

/** 
       * CASE #1 >>  NOW can be AFTER start and end time. 
       *    E.g. now == 21.30 and start == 18.00 and end == 21.00 
       * 
       * CASE #2 >>  NOW can be BEFORE start and end time. 
       *    E.g. Now == 17.00, start == 18, end == 21.00 
       * 
       * CASE #3 >>  NOW can be BETWEEN start and end time. 
       *    E.g. Now == 19, start == 18, end = 21.00 
       */ 

       // CASE #1 
       if (($support->isExpired($start) === true) && ($support->isExpired($end) === true)) { 

        echo 'CASE #1 - siamo ben oltre sia l\'inizio che la fine'; 

       } 

       // CASE #2 
       if (($support->isExpired($start) === false) && ($support->isExpired($end) === false)) { 

        echo 'CASE #2 - siamo ben PRIMA sia dell\'inizio che della fine'; 

       } 

       // CASE #3 
       if (($support->isExpired($start) === true) && ($support->isExpired($end) === false)) { 

        echo 'CASE #3 - siamo TRA l\'inizio E la fine'; 

       } 

は、私は3例をコピーし、前のチェック($場合スタート> $ ....他に終わる擬似コード)を適用することができ

public function isExpired($date=null,$qty=1,$interval='seconds') { 

     $now = new \DateTime(null, new \DateTimeZone("UTC")); 

     $expiry_date = new \DateTime($date, new \DateTimeZone("UTC")); 

     date_add($expiry_date, date_interval_create_from_date_string($qty.' '.$interval)); 

     if ($now >= $expiry_date) { 

      return true; 

     } else { 

      return false; 
     } 

    } 

(これはisExpired方法です)偽/真実については、私は3つのケースを得るより良いモードがあると思います。

ありがとうございました!

+0

[carbon](http://carbon.nesbot.com/docs/)と 'between'メソッドをチェックしてください。 –

+0

'if($ start> $ end)$ end + = 24;'を使って正常に処理することができます。 – inarilo

+0

@inariloもし$ nowが23:59より小さい場合は$ start = 18:00と$ end = 03.00(あなたの場合は27:00)の間で比較できます。しかし、$ now == 02:00の場合、$ nowは18.00から27:00の間ではありません。私は私が明確であることを願っています... – sineverba

答えて

0

あなたはタイムゾーン情報を追加する必要があるが、私は次のようにします。

/** 
    * @param $date  DateTime to evaluate 
    * @param $dateFrom Start DateTime 
    * @param $dateTo  End DateTime 
    * @return bool 
    */ 
    public static function isDateTimeBetween($date, $dateFrom, $dateTo) 
    { 
     return ($date>=$dateFrom && $date<=$dateTo); 
    } 
+0

テストする必要があります....ありがとうございました....私はすぐに更新します – sineverba

0

基本的なロジックはこれであるあなたがDateTimeオブジェクトを使用している場合、実際の比較演算を調整する必要があります。

if($start > $end) return ($now >= $start || $now <= $end); 
else return ($now >= $start && $now <= $end); 

これは、日付データではなく時刻データのみを使用していることを前提としています。

関連する問題