如何在PHP 5.2.8中比较两个DateTime对象?

Red*_*ing 280 php datetime

这看起来应该是非常简单的事情,但是我已经暂时陷入页面错误这个问题,所以这里有.

看看PHP文档,DateTime对象的以下两种方法似乎都解决了我的问题:

这两种方法都在doco中标记为在版本> = 5.3中可用(并且,毫不奇怪,如果我尝试调用它们,我发现它们不存在).我找不到5.2.8的任何具体文档,所以我不确定我的版本中是否有相同的方法.我已经用Google搜索了问题并找到了一系列不拘一格的解决方案,这些解决方案都没有满足我非常简单的要求:

  • 如何比较两个DateTime对象?
  • 我在哪里可以找到以前PHP版本的doco?特别是版本5.2.8?

对于某些上下文,我有以下代码:

$st_dt = new DateTime(verifyParam ('start_date'));
$end_dt = new DateTime(verifyParam ('end_date'));

// is the end date more ancient than the start date?
if ($end_dt < $start_dt) 
Run Code Online (Sandbox Code Playgroud)

显然这个家伙没有比较运算符.

编辑:显然我的假设是完全错误的(感谢Milen如此有效地说明这一点).有一个比较运算符,它工作得很好,谢谢.有时我真的很想念编译器.该错误在上面的代码中,我相信你会发现它比我快得多:).

我期待着您对解决方案简单性的尴尬.

编辑:当然,尴尬随之而来......

Mil*_*dev 416

以下似乎确认了DateTime类的比较运算符:

dev:~# php
<?php
date_default_timezone_set('Europe/London');

$d1 = new DateTime('2008-08-03 14:52:10');
$d2 = new DateTime('2008-01-03 11:11:10');
var_dump($d1 == $d2);
var_dump($d1 > $d2);
var_dump($d1 < $d2);
?>
bool(false)
bool(true)
bool(false)
dev:~# php -v
PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 26 2009 20:09:03)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
dev:~#
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Milen,看起来我只需要删除我的错误假设,突然间,我的代码中的明显错误对我来说变得明显. (7认同)
  • 比较日期时间与没有小时设置和一个设置时的注意事项(默认构造函数) (7认同)
  • 嗯,这很有意思.也许在某些时候我们将能够在用户定义的类中重载运算符. (2认同)

小智 45

官方文档:

从PHP 5.2.2开始,可以使用比较运算符比较 DateTime对象.

$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2); // false
var_dump($date1 < $date2); // true
var_dump($date1 > $date2); // false
Run Code Online (Sandbox Code Playgroud)

对于5.2.2之前的PHP版本(实际上对于任何版本),您可以使用diff.

$datetime1 = new DateTime('2009-10-11'); // 11 October 2013
$datetime2 = new DateTime('2009-10-13'); // 13 October 2013

$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days'); // +2 days
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个答案最好,因为它引用手册而不仅仅是检查行为并假设结果符合预期.所以不是猜测的地方.布拉沃罗伯托. (3认同)
  • @roberto [DateTime :: diff](http://php.net/manual/en/datetime.diff.php)仅在PHP 5.3中添加 (2认同)

Jul*_*ien 30

您还可以比较纪元秒:

$d1->format('U') < $d2->format('U')
Run Code Online (Sandbox Code Playgroud)

来源:http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/ (关于DateTime的非常有趣的文章)

  • 请注意`format`生成一个*string*,这是一个字符串比较.在10万个纪元时间(大约在2001年9月9日)之后几乎没有问题,但是如果你必须在*之前处理日期*,那么由于数字长度不同,你可能会遇到问题.将结果转换为数字(减去它们也可以),或使用像`c`这样的真正可排序格式. (16认同)
  • @MaxArt:根据文档:[如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较.这些规则也适用于switch语句.当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值.](http://www.php.net/manual/en/language.operators. comparison.php). (2认同)
  • @FrédéricMarchal是的,后来我确实得知我以前的评论实际上是错误的。PHP有一种非常邪恶的方式来处理这些情况,当您要比较两个字符串时,没有其他语言(据我所知)会强制转换为数字。如果您确实想进行词典比较,那确实会弄乱您的代码。 (2认同)

bla*_*bla 20

如果你想比较日期而不是时间,你可以使用这个:

$d1->format("Y-m-d") == $d2->format("Y-m-d")
Run Code Online (Sandbox Code Playgroud)

  • 您还可以设置重置时间.`$ d1-> setTime(0,0,0);` (5认同)