【问题标题】:How to calculate duration in days?如何计算以天为单位的持续时间?
【发布时间】:2014-05-16 01:01:18
【问题描述】:

我必须在 30 天后发出通知。

foreach ($pdo->query($sql) as $row) {
$date = date_create($row['data']);
$laikotarpas = date_diff(new DateTime("now"), $date);
// var_dump($liko);
$liko = 30 - $laikotarpas->d;

我想要几天后的正确结果。 我在 2014.03.19 添加了一行,这表明还剩 3 天到 30 天。

我的目标是: 我在 2014.03.19 添加记录并得到从今天过去多少天的结果。我认为 $laikotarpas->d 给出了以天为单位的持续时间,但是,当我进行计算以将限制设置为 30 天时。 所以我的主要问题是获得正确的 $liko,但我不知道如何。 我正在使用此代码(使用 PDO)添加我的时间:

$q->execute(array($name, 
date("Y-m-d H:i:s", time())
);

在我的数据库中,我使用 DATETIME。我使用这个 php 从 SQL 打印该日期:

<?php echo date_format(date_create($data['data']), 'Y-m-d'); ?>

我的方法好吗?如何改进?

-----编辑-----

我必须使用php5.2

刚刚有了一个想法,它只需要几天,忽略几个月过去的计数。如何更新它以仅以天为单位计算持续时间?

【问题讨论】:

    标签: php mysql date datetime pdo


    【解决方案1】:

    如果您想找出现在和过去某个日期之间的差异,请尝试以下操作:

    PHP >= 5.2.0

    $then = '2014-03-19';
    $date = new DateTime($then);
    $now = new DateTime('now');
    $diff = $date->diff($now);
    
    echo $diff->days . ' days since ' . $then . PHP_EOL; // 58 days since 2014-03-19
    

    PHP
    $date = strtotime($then);
    $now = time();
    $diff = $now - $date;
    $days = round($diff / 60 / 60 / 24); // convert seconds to days and round off
    

    注意:在进一步了解您的问题后,我强烈建议您在 MySQL 而不是 PHP 中根据日期范围过滤您的结果 - 这会更容易、更经济,并且会降低您的潜在风险用于影响您无意影响的数据。 See Cull Larson's answer.

    【讨论】:

    • 但是如何用天数来限制它们。例如,我想在记录添加到数据库后的 30 天前 5 天(25 天后发送电子邮件)通知我的客户。
    • 顺便说一句,我使用的是 php 5.2
    • @pvaitonis 您应该在 MySQL 查询中选择在 30 天前 5 天联系的客户,而不是在 PHP 中这样做。通过仅在 MySQL 中选择合适的客户发送到然后在 PHP 中发送(如果您愿意,请在 PHP 中再次验证日期),最大限度地减少发生错误的可能性。
    • 附言。 DateTime 类是在 PHP 5.2.0 中引入的,所以你很好
    【解决方案2】:

    你可以使用这样的查询:

    SELECT * FROM myTable WHERE DATE(signupDate) = DATE_SUB(NOW(), INTERVAL 25 DAY);
    

    这将为您提供注册日期为 25 天的所有结果。如果您在表格中有一个标志告诉您是否已通知他们,您也可以传递它:

    SELECT * FROM myTable WHERE notified=false AND DATE(signupDate) = DATE_SUB(NOW(), INTERVAL 25 DAY);
    

    如果您想获取 25 天或更早的每条记录,则尚未通知:

    SELECT * FROM myTable WHERE notified=false AND DATE(signupDate) <= DATE_SUB(NOW(), INTERVAL 25 DAY);
    

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 1970-01-01
      • 2019-01-07
      • 2015-03-10
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多