簡體   English   中英

在while循環中有日期比較的奇怪行為

[英]Strange behaviour in a while loop with a date compare in PHP

嗨,我正在嘗試創建一個簡單的while循環,該循環從PHP中的數據庫中提取一個關聯數組。 本質上,我想對從數據庫中提取的日期與當前日期進行比較。 這里是要抓住的地方。 不同部分(表中顯示)有不同的截止日期。 因此,我需要通過減去某些天數來修改從數據庫中提取日期的日期。 我用不同的變量完成了此操作,但得到了一些奇怪的結果,這些結果與我指定的結果不同。 我想念什么嗎?

$today = date("Y-m-d") 

while ($query_row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))

                    {          

    $date =  $query_row['DueDate'];// this is the due date from the  server
    $duedate = $date->format('d-m-Y'); // to output in table
    $compare1 = $date;
    $compare2 = $date;
    $compare3 = $date;
    $compare4 = $date;                             
    $compare1->modify('-4 days');
    $compare2->modify('-3 days');
    $compare3->modify('-2 days');
    $compare4->modify('-1 day');


    echo $today.' today <br/>';
    //just for debugging
    echo $date ->format('Y-m-d').' due date <br/>';
    echo $compare1->format('Y-m-d').' minus 4 date <br/>';

    if (  $today >= $compare1 )
    {   

        $Triginsert = 'style="background-color: #ff0000;"';

    }
    else 
    {

        $Triginsert = '';
    }
    }

如您所見,當前日期是否大於或等於比較日期,該日期應該是從服務器拉出的日期-4天,那么它應該變成紅色塊,否則它什么都不做。

任何幫助都會很棒。

謝謝

發生的是,由於對象是在php 5+中通過引用分配的,因此所有$ compare變量都是對同一原始$ date對象的引用。 因此,您要反復修改同一個,而不是創建4個單獨的同一個。 參見http://www.php.net/manual/zh/language.oop5.references.php 您想要的是:

$compare1 = clone $date;
$compare2 = clone $date;
etc.

順便說一句,當您使用var_dump($ query_row ['DueDate'])時會得到什么? 我以為它已經是一個日期對象,否則-> modify()調用將立即出錯,並且您是在說自己正在得到怪異的行為,而不是錯誤消息,但是其他一些答案都假定$ query_row [' DueDate']是一個字符串,因此我想再次檢查。

來自查詢的數據將只是文本而不是Date對象,您需要使用該數據來設置對象以實現所需的功能

$date = new DateTime($query_row['DueDate']);

您將要遇到的問題基於DueDate的形式,因此您可能需要首先對其進行操作。

這是設置Date對象的說明http://www.php.net/manual/zh/datetime.construct.php

您的問題是這樣的:

$date =  $query_row['DueDate'];// this is the due date from the  server
^^^^^^----string
$duedate = $date->format('d-m-Y'); // to output in table
           ^^^^^---using string as an object

您需要通過構造函數將$date STRING傳遞給DateTime系統,例如

$date = new DateTime($query_row['DueDate']);

然后,您可以開始將其用作對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM