DateTime比较两个日期

时间:2016-08-03 11:21:22

标签: php datetime

目标是区分两个日期。

我在我的db表中的timestamp列下有一个DateTime对象。我使用Doctrine来检索日期,一旦从我的数据库中检索了日期,它就像var_dump一样;

    array(1) {
  [0]=>
  array(1) {
    ["timestamp"]=>
    object(DateTime)#321 (3) {
      ["date"]=>
      string(26) "2016-08-03 11:03:36.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/London"
    }
  }
}

现在,检索到的对象已分配到$result变量,以转到DateTime对象$result[0][timestamp]

要检索实际数据,我根据此documentation

执行了此操作$date1 = $result->format('Y-m-d H:i:s');

所以现在我已经检索了一行插入我的数据库的日期,我需要另一个截止当前时间的日期。

即:

$date1 = $result->format('Y-m-d H:i:s');
$date2 = new DateTime();
$test = $date1->diff($date2);

根据此documentation

进行差异

这给了我这个错误:

Error: Call to a member function diff() on a non-object

任何想法为什么我收到此错误消息看起来像是根据码头以正确的方式做事。也许有另一种方式做差异两个日期OPP的方式。

更新

好的,是的,如果我使用$date1 = $result->format('Y-m-d H:i:s');它不再是一个对象,它是真的。

所以现在我的代码看起来像这样:

$ test = $ result-> diff(new DateTime()); 的var_dump($测试);

它返回DateInterval对象,但我从中得到了什么:

object(DateInterval)#317 (15) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(1)
  ["i"]=>
  int(27)
  ["s"]=>
  int(5)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(0)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)

如果Date1差异到Date2,我需要的是>超过30分钟,我想采取一些行动。

4 个答案:

答案 0 :(得分:2)

这是因为method format返回字符串,而不是对象。尝试使用:

$test = $result->diff(new DateTime());

答案 1 :(得分:2)

$date1 = $result->format('Y-m-d H:i:s');

$date1现在是一个没有format()方法的字符串。

请尝试以下方法: -

$date1 = $result->format('Y-m-d H:i:s');
$date2 = new DateTime();
$test = $result->diff($date2);

答案 2 :(得分:0)

执行$date1 = $result->format('Y-m-d H:i:s');之后。 $date1不再是DateTime对象,而是日期和时间的字符串表示。

因此跳过这一行。不要格式化,然后检查差异。这会给你一个DateTimeInterval对象。

答案 3 :(得分:0)

对于任何不知道diff()做什么的人,它会比较两个日期并返回差异 - 但不太可能是其他减法方法,diff()永远不会返回负值。如果第一个日期大于或小于第二个日期,则无关紧要。

现在,如果这不是这种情况的问题,下一步是访问DateInterval对象中的必要值。

$diff=(array)$date1->diff($date2);      // calculate the difference and cast as an array
$labels=array("y"=>"year","m"=>"month","d"=>"day","h"=>"hour","i"=>"minute");
// filter the $diff array to only include the desired elements and loop
foreach(array_intersect_key($diff,$labels) as $k=>$v){
    if(($k!="i" && $v>0) || $v>30){
        // $labels[$k] = $v > 30 minutes, take some action
    }
}