php DateTime diff仅考虑Y-m-d格式

时间:2013-11-06 10:03:31

标签: php datetime datediff

在mysql db中,我在t1表中定义了一个时间戳字段(dateexp)。 查询我只考虑格式化时间戳的Y-m-d来查找记录。使用curdate()而不是now()

SELECT * FROM t1 WHERE dateexp < currdate()

我想用php使用DateTime类来查找日期之前的天数 但是我无法理解如何只比较Y-m-d格式。

我试过这种方式,但我使用Y-m-d H:i:s格式。

$row['dateexp'] = "2013-11-10 12:00:00";

$d1 = new DateTime();
$d2 = new DateTime($row['dateexp']);
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');

我怎么能只比较Y-m-d?我尝试使用DateTime :: createFromFormat,但可能是错误的方式..

由于

3 个答案:

答案 0 :(得分:2)

您有几种可行的方法可以做到这一点。首先,您可以从DBMS中选择所需格式的日期字符串:

SELECT *, DATE(dateexp) AS date_holder FROM t1 WHERE dateexp < currdate()

然后将其应用于DateTime对象:

$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime($row['date_holder']);
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');

第二 - 正如您所提到的,您可以从格式:

创建DateTime
$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime(date('Y-m-d', strtotime($row['dateexp'])));
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');

- 您将能够避免在DBMS中选择其他字段

答案 1 :(得分:0)

PHP

请勿将date()strtotime()函数与DateTime extension混合。

您可以使用关键字today创建DateTime对象,以便在没有时间的情况下设置今天的日期,或者在DateTime对象上使用DateTime::setTime()来设置您希望的时间:

$d1 = new DateTime('today');
$d2 = new DateTime($row['dateexp']);
$d2->setTime(0, 0);
echo $d1->diff($d2)->format('%r%a');

<强> Demo


的MySQL

或者您已经可以使用函数TIMESTAMPDIFF计算MySQL中的天差:

SELECT TIMESTAMPDIFF(DAY, CURDATE(), DATE('2013-11-10 12:00:00'))

或在你的情况下:

SELECT *, TIMESTAMPDIFF(DAY, CURDATE(), DATE(dateexp)) AS diff_in_days
FROM t1 
WHERE dateexp < CURDATE()

答案 2 :(得分:0)

不依赖于MySQL,在两个DateTime对象上调用setTime(0, 0, 0)(如果需要,首先克隆它们)以将时间重置为午夜,然后使用$dateTime1 <= $dateTime2的结果仅比较天数。干净易读。

$dateTime1->setTime(0, 0, 0);
$dateTime2->setTime(0, 0, 0);
$dateTime1 < $dateTime2;  
$dateTime1 <= $dateTime2; // same day will return true