44472


いつもお世話になってます。  
phpを使用しての日付比較について詰まってしまったので教えていただきたいです。  
下記のようにDBから取ってきた日付情報を現在の日時と比較をして、  
比較結果により$statusに追加する要素を変えようとしています。

そこで下記コードで試すと、  
各変数はifの条件は満たしているはずなのですが、  
statusに値が入らず処理が終了してしまいます。  
デバッグしてみるとifの最初の条件で弾かれて、  
elseifを通らずにif文を抜けてしまいます。

※日時が入っている変数は以下ルールで入っています。  
$acStart < $acEnd < $cntStart < $cntEnd

ifの条件は通っているはずなのに、弾かれる原因が分かりません。  
間違っている箇所はどこなのでしょうか。  
また、情報不足がありましたら追記しますので、  
お知らせいただけると助かります。

※php5.6使用

$getContestsはDBにdatetime型で入っている値が連想配列で入っております。

[code]

        $status = array();
            $today = new DateTime();
            for($i = 0; $i < count($getContests); $i++){
                $cntStart = new DateTime($getContests[$i]['cont_start_date']);
                $cntEnd = new DateTime($getContests[$i]['cont_end_date']);
                $acStart = new DateTime($getContests[$i]['accept_start_date']);
                $acEnd = new DateTime($getContests[$i]['accept_end_date']);
    
                if($cntStart >= $today && $cntEnd <= $today) {
                    $status += array($i=>"開催中");
                }else if($acStart >= $today && $acEnd <= $today){
                    $status += array($i=>"受付中");
                }
    
            }
    
[/code]

以上、よろしくお願いいたします。


CC BY-SA 4.0
2018-06-02T09:00:15.803
44468
2018-06-02T11:47:06.993
13251
question
php cakephp array
phpで日付比較ができません


その他の部分は意図通りに動いていると言うことが前提ですが、この`if`文の部分:

[code]

            if($cntStart >= $today && $cntEnd <= $today) {
                $status += array($i=>"開催中");
            }else if($acStart >= $today && $acEnd <= $today){
                $status += array($i=>"受付中");
            }
    
[/code]

> `$cntStart >= $today` 現在日時が開始日時より前
>
> かつ
>
> `$cntEnd <= $today` 現在日時が終了日時より後

と言う条件になっています。`$cntStart < $cntEnd`が成り立っているということで、これでは決して条件が真にはなりません。

(単純化した整数比較でいうと、`x <= 3 && 5 <= x`が決して真にならないのと同じ。)

`$today`がある日付範囲に入っていることを判定したいのであれば、次のようになるはずではないでしょうか。

[code]

            if( $cntStart <= $today && $today <= $cntEnd ) {
                $status += array($i=>"開催中");
            } else if( $acStart <= $today && $today <= $acEnd ) {
                $status += array($i=>"受付中");
            }
    
[/code]

* * *

`$status +=
array($i=>"開催中");`という配列操作の書き方も、私の趣味に合わないのですが、動作としては問題無いはずなのでそのままにしておきます。一般的に、このように範囲判定の条件を書く場合には、不等号を`<=`(または`<`)だけに統一した方が間違いが少ないように思います。


CC BY-SA 4.0
2018-06-02T11:47:06.993
44472
2018-06-02T11:47:06.993
13972
44468
answer