【问题标题】:php DateTime diff consider only Y-m-d formatphp DateTime diff 只考虑 Y-m-d 格式
【发布时间】:2013-11-06 10:03:30
【问题描述】:

在 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 但可能是错误的方式..

谢谢

【问题讨论】:

  • 请澄清“仅日期”是什么意思。所以你需要只用日期部分创建DateTime 对象吗?或者找出天数的差异(所以时间部分很重要)?
  • 我想查找格式为 Y-m-d (2013-11-05) 而不是格式为 Y-m-d H:i:s (2103-11-05 11:00:00) 的 2 个日期的差异.小时、分钟和秒会影响结果,具体取决于时间是之前还是之后

标签: php datetime datediff


【解决方案1】:

您有几种可能的方法来做到这一点。首先,您可以从 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 中选择其他字段

【讨论】:

    【解决方案2】:

    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

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

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多