【问题标题】:Getting Yesterdays Date at Exactly Midnight in PHP在 PHP 中的午夜获取昨天的日期
【发布时间】:2017-04-09 19:26:06
【问题描述】:

我应该对此有什么问题吗?

我正在午夜设置一个 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 运行它也可能会在那一分钟内留下一些额外的行。

【问题讨论】:

  • 你很好,你的 cron 作业只会在午夜运行一次,你完全不用担心。不过,真的,它是午夜还是任何时候都没有关系,它只运行一次。
  • 让系统依赖于在午夜运行的作业似乎真的很危险。你应该想出另一种方法来实现你的目标。
  • @Evan Carslake :嗯,我知道它只会运行一次,但我担心的是,因为它在午夜运行,DateTime 可能会搞砸,我可能会得到重复。 @Gordon Linoff:因此这个问题:) 我想知道我是否可以在 DateTime 上增加 12 小时,然后将时间设置为 00:00:00 或者是否有更好的方法
  • @BrianBruman 对,但我的意思是,午夜只出现一次,与任何其他时间相同。 00:00::00 与希望它只在 5 点钟 05:00:00 运行一次没有什么不同。午夜只持续那一秒,然后是 00:00:01。你很好……

标签: php date cron


【解决方案1】:

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

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

【讨论】:

  • 您也可以通过将字符串传递给 strtotime() 来实现。例如:date("Y-m-d H:i:s", strtotime("2018-09-18 00:00:00"));date("Y-m-d H:i:s", strtotime("2018-09-18 23:59:59"));
【解决方案2】:

我的解决方案(在 cmets 中遇到过这种情况)是执行以下操作:

请记住,脚本设置为在午夜 (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

我并不是说这是最好的方法,这个想法只是我突然想到的。但这似乎可能会为我正在尝试做的事情增加一种故障保险。

如果有人有更好或更合适的解决方案,我会暂时搁置。

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多