计算2个日期

时间:2017-03-06 19:22:31

标签: php

我要做的是,每天两次脚本将通过cron运行,它会检查用户购买服务的日期(purchased_added是列)。我想查看哪个购买日期是今天的日期前27天,例如

购买服务: 2017-02-09 02:01:35 27天后他们会: 2017-03-08 02:01:35 脚本找到它将发送电子邮件的目标。

到目前为止,我有:

if (isset($_GET['notify'])) {
        include('includes/db_connection.php');
        include('includes/functions.php');
        // first get all the purchased dates out...
        $dates = DB::getInstance()->select('SELECT * FROM `purchased` ORDER BY `purchased_added` ASC'); 
        foreach ($dates as $r) { 
          echo $r['purchased_added'] . "<br />";
          // dates - purchased & now
          //$datePur = date('m.d.y', strtotime($row['purchased_added'])
          //$dateNow = date('m.d.y');
          // any links due for payment?
          if (date('m.d.y', strtotime($r['purchased_added']. ' + 27 days')) < date('m.d.y')) {
            // email these users
          }
        }
}

我的if语句对我来说是错误的,有没有更简单的方法来实现这一目标?我觉得我太复杂了。

2 个答案:

答案 0 :(得分:1)

您可以直接比较时间戳:

if(strtotime($r['purchased_added']. ' + 27 days') < time())

或使用与所需排序兼容的日期格式(&#39; 17.02.09&#39;&lt;&#17; 17.03.08&#39;但如果日/年,这通常会被违反被翻转):

if(date('y.m.d', strtotime($r['purchased_added']. ' + 27 days')) < date('y.m.d'))

或者最好使用DateTime

$current_dt = new DateTime("now");
$dt = new DateTime($r['purchased_added']. ' + 27 days');
if($dt < $current_dt)
    ....

甚至

$current_dt = date_create("now");
if(date_create($r['purchased_added']. ' + 27 days') < $current_dt)
    ....

答案 1 :(得分:0)

我建议您在SQL查询本身中实现此逻辑。如果您的表有很多行,您也可以向purchase_added添加索引。您还可以在发送电子邮件后添加一个标记列(或发送多少封电子邮件)。

SELECT * FROM `purchased` WHERE `purchased_added` < DATE_ADD(NOW(), INTERVAL -27 DAY)

这只会返回purchase_added超过27天前的行。

这样你就不会从表中读取所有记录,如果表变大,以后只需添加一个索引。