在PHP中使用日期比较的while循环中的奇怪行为

时间:2014-04-09 16:20:47

标签: php datetime while-loop

您好我正在尝试创建一个简单的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天然后它应该把块变成红色,否则它应该什么都不做..

任何帮助都会很棒。

谢谢

3 个答案:

答案 0 :(得分:0)

正在发生的事情是,由于对象是在php 5+中通过引用分配的,因此所有$ compare变量都是对同一原始$ date对象的引用。所以你反复修改同一个,而不是创建4个单独的。见http://www.php.net/manual/en/language.oop5.references.php。 你想要的是:

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

BTW你在var_dump($ query_row ['DueDate'])时得到了什么?我假设它已经是一个日期对象,否则 - &gt; modify()调用会立即出错,并且你说你得到了奇怪的行为而不是错误消息,但其他一些答案假设$ query_row [ 'DueDate']是一个字符串,所以我想仔细检查。

答案 1 :(得分:0)

来自查询的数据将只是文本而不是Date对象,您需要使用该数据设置对象以实现您想要的目标

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

您将遇到的问题基于DueDate的形式,因此您可能需要先操作它。

以下是设置Date对象http://www.php.net/manual/en/datetime.construct.php

的说明

答案 2 :(得分:0)

你的问题是:

$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']);

那么你可以开始将它作为一个对象使用。