首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHPDateInterval是否与日期时间类似?

PHPDateInterval是否与日期时间类似?
EN

Stack Overflow用户
提问于 2018-01-29 00:42:37
回答 2查看 0关注 0票数 0

我发现PHP中的DateTime对象可以与另一个对象进行比较,因为“>”和“<”运算符被重载。

这与DateInterval是一样的吗?

当我试图回答这个问题时,我发现了一些奇怪的东西:

代码语言:javascript
复制
<?php 

$today = new DateTime();
$release  = new DateTime('14-02-2012');
$building_time = new DateInterval('P15D');
var_dump($today->diff($release));
var_dump($building_time);
var_dump($today->diff($release)>$building_time);
var_dump($today->diff($release)<$building_time);
if($today->diff($release) < $building_time){
    echo 'oK';
}else{
    echo 'Just a test';
}

它始终返回“Just a test”。var_dump输出是:

代码语言:javascript
复制
object(DateInterval)#4 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(18)
  ["h"]=>
  int(16)
  ["i"]=>
  int(49)
  ["s"]=>
  int(19)
  ["invert"]=>
  int(1)
  ["days"]=>
  int(18)
}
object(DateInterval)#3 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(15)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
}
bool(false)
bool(true)

当我使用DateTime作为“01-03-2012”时,一切正常。

EN

回答 2

Stack Overflow用户

发布于 2018-01-29 09:22:45

经过一些测试后,似乎可以比较它们,但是只有在它们以某种方式被“评估”之后(做一个var dump才能改变结果)。这是我的测试/结果:

代码语言:javascript
复制
<?php
$int15 = new DateInterval('P15D');
$int20 = new DateInterval('P20D');

var_dump($int15 > $int20); //should be false;
var_dump($int20 > $int15); //should be true;

var_dump($int15 < $int20); //should be true;
var_dump($int20 < $int15); //should be false;

var_dump($int15);
var_dump($int20);

var_dump($int15 > $int20); //should be false;
var_dump($int20 > $int15); //should be true;

var_dump($int15 < $int20); //should be true;
var_dump($int20 < $int15); //should be false;

$date = new DateTime();
$diff = $date->diff(new DateTime("+10 days"));

var_dump($int15 < $diff); //should be false;
var_dump($diff < $int15); //should be true;

var_dump($int15 > $diff); //should be true;
var_dump($diff > $int15); //should be false;

var_dump($diff);

var_dump($int15 < $diff); //should be false;
var_dump($diff < $int15); //should be true;

var_dump($int15 > $diff); //should be true;
var_dump($diff > $int15); //should be false;

结果:

代码语言:javascript
复制
bool(false)
bool(false)
bool(false)
bool(false)
object(DateInterval)#1 (8) {...}
object(DateInterval)#2 (8) {...}
bool(false)
bool(true)
bool(true)
bool(false)

bool(false)
bool(true)
bool(true)
bool(false)
object(DateInterval)#5 (8) {...}
bool(false)
bool(true)
bool(true)
bool(false)
票数 0
EN

Stack Overflow用户

发布于 2018-01-29 10:30:05

简而言之,比较DateInterval对象目前不支持(从PHP 5.6开始)。

如你所知,这些DateTime对象是可比的。

达到所需结果的一种方法是DateInterval从一个DateTime对象中减去或添加一个对象,然后比较两者来确定差异。

例如:

代码语言:javascript
复制
$buildDate = new DateTime();
$releaseDate  = clone $buildDate;
$releaseDate->modify('2012-02-14');
$buildDate->add(new DateInterval('P15D'));

var_dump($releaseDate < $buildDate); //bool(true)

从PHP 7.1发布以来,由于增加了对微秒支持,结果与PHP 5.x不同。

例如:

代码语言:javascript
复制
$a = new \DateTime;
$b = new \DateTime;
var_dump($a < $b);

结果(7.1+)

代码语言:javascript
复制
bool(true)

结果(5.x - 7.0.x,7.1.3)

代码语言:javascript
复制
bool(false)

为了规避这种行为,建议你使用clone比较DateTime对象。

例如:

代码语言:javascript
复制
$a = new \DateTime;
$b = clone $a;
var_dump($a < $b);

结果(5.x - 7.x)

代码语言:javascript
复制
bool(true)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档