在PHP的正午夜获取昨天的日期

时间:2017-04-09 19:26:07

标签: php date cron

我是否应该对此有任何疑问?

我正在午夜时分安排一个cron工作

0   0   *   *   *    /usr/bin/php    myscript.php

脚本设置为以MySQL时间戳格式定义前一天的日期。

$midnightyesterday2 = (new DateTime())->setTime(0, 0);
$midnightyesterday2->modify('-1 day');
$midnightyesterday = $midnightyesterday2->format("Y-m-d H:i:s");

回声输出:

  
    

2017-04-08 00:00:00

  
$endofdayyesterday2 = (new DateTime())->setTime(23, 59, 59);
$endofdayyesterday2->modify('-1 day');
$endofdayyesterday = $endofdayyesterday2->format("Y-m-d H:i:s");

回声输出:

  
    

2017-04-08 23:59:59

  

显然这个示例输出工作正常,因为我在15:22:00这样做。

如果脚本由于某种原因提前一小段时间,那么在午夜设置一个cron工作可能会导致冲突甚至是半秒钟,这只是一种偏执狂。

有没有更好的方法来确保昨天的日期,脚本设置为在午夜时分运行?

我需要它在午夜时分运行,因为脚本基于MySQL lastmodified时间戳,正如我的回音所暗示的那样,甚至在12:01运行它可能会留下一些额外的行在那一分钟被添加

2 个答案:

答案 0 :(得分:2)

请尝试以下代码,以获取确切时间的昨天开始和结束日期。

date("Y-m-d H:i:s", strtotime("yesterday")); // 2018-09-18 00:00:00

date("Y-m-d H:i:s", strtotime("today 1 sec ago")); // 2018-09-18 23:59:59

答案 1 :(得分:0)

我的解决方案(评论中提到的那种方法)是执行以下操作:

请记住,脚本设置为在午夜(00:00:00)运行。

所以我设置了一个新的DateTime对象,增加了12个小时。 (12:00:00)

然后提前12小时移动,使用setTime将时间设置为00:00:00。

然后再次使用DateTime的modify减去24小时。

$midnightyesterday2 = new DateTime();
$midnightyesterday2->modify('+12 hour');
$midnightyesterday2->setTime(0, 0);
$midnightyesterday2->modify('-24 hour');
$midnightyesterday = $midnightyesterday2->format("Y-m-d H:i:s");
echo $midnightyesterday;
  
    

2017-04-08 00:00:00

  

与获得昨天结束的结果相同

$endofdayyesterday2 = new DateTime();
$endofdayyesterday2->modify('+12 hour');
$endofdayyesterday2->setTime(23, 59, 59);
$endofdayyesterday2->modify('-24 hour');
$endofdayyesterday = $endofdayyesterday2->format("Y-m-d H:i:s");
echo $endofdayyesterday;
  
    

2017-04-08 23:59:59

  

我不是说这是最好的方法,这个想法只是来找我。但似乎可能会为我正在尝试的事情添加一种故障安全措施。

如果有人有更好或更合适的解决方案,我会暂时保持这种状态。