在布尔值上调用成员函数format()

时间:2017-09-19 06:20:30

标签: php date

我想找到两个日期之间的差异,我使用了date_diff。当格式函数应用于date_diff对象时,它会返回错误。

  

在布尔

上调用成员函数format()
从数据库中提取 $field_value ,其格式为 dd/mm/YYYY 。当我对 $field_value $indexing_value 的值进行硬编码时,以下代码可以正常运行。

一直运行正常,直到第8行。我已经尝试输出

的值
$diff->format("%R%a")

并返回精确值,但代码在if语句附近出错。

$date = new DateTime();
$current_date = $date->format('d/m/Y');
$indexing_value = str_replace("/", "-", $field_value);
$current_value = str_replace("/", "-", $current_date);
$indexing_value = date_create($indexing_value);
$current_value = date_create($current_value);

$diff = date_diff($indexing_value, $current_value);
if ($diff->format("%R%a") < 0) {
    echo "1";
} else {
    echo "2";
}

请告诉我上述代码有什么问题。

2 个答案:

答案 0 :(得分:1)

添加条件以检查是否有diff,因为如果有错误则返回false。检查manual是否有相同的

$diff = date_diff($indexing_value, $current_value);
if ($diff) {
    if ($diff->format("%R%a") < 0) {
        echo "1";
    }else{
        echo "2";
    }   
}

您收到错误是因为某些值未计算差异且False

中的值为$diff

答案 1 :(得分:0)

  

请告诉我上述代码有什么问题。

代码有几个问题:

  1. 您不检查date_create()返回的值;它返回FALSE on error

  2. 格式化$date然后从结果字符串中创建$current_value有什么意义?如果您不关心时间组件并且只需要使用DateTime对象的日期部分,则可以使用其setTime()方法将时间组件设置为0

  3. 当您知道日期时,使用str_replace()来操纵日期的文本表示是什么意思? DateTime::createFromFormat()可用于将字符串解析为DateTime对象。

  4. 无需计算两个日期的差异及其格式,并将该值与0进行比较。可以直接比较DateTime个对象。

  5. 总而言之,您需要的所有代码都是:

    // Current date & time
    $today = new DateTime();
    // Ignore the time (change $today to "today at midnight")
    $today->setTime(0, 0, 0);
    
    // Parse the value retrieved from the database
    $field = DateTime::createFromFormat('d/m/Y', $field_value);
    // We don't care about the time components of $field either (because the time
    // is not provided in the input string it is created using the current time)
    $field->setTime(0, 0, 0);
    
    // Directly compare the DateTime objects to see which date is before the other
    if ($field < $today) {
        echo "1";
    } else {
        echo "2";
    }