Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中准确地在午夜获取昨天的日期_Php_Date_Cron - Fatal编程技术网

在PHP中准确地在午夜获取昨天的日期

在PHP中准确地在午夜获取昨天的日期,php,date,cron,Php,Date,Cron,我对这个有什么意见吗 我正好在午夜时分安排了一个cron任务 0 0 * * * /usr/bin/php myscript.php 脚本设置为以MySQL时间戳格式定义前一天的日期 $midnightyesterday2 = (new DateTime())->setTime(0, 0); $midnightyesterday2->modify('-1 day'); $midnightyesterday = $midnightyesterday2-&g

我对这个有什么意见吗

我正好在午夜时分安排了一个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

回波输出:

2017-04-08 23:59:59

很明显,这个示例输出工作正常,因为我是在15:22:00完成的

如果脚本出于某种原因提前运行了一小部分,那么在午夜设置cron作业可能会导致冲突,甚至是半秒,这只是我的一种妄想吗

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

我需要它正好在午夜运行,因为正如我的echo建议的那样,脚本基于MySQL
lastmodified
时间戳,即使在12:01运行它,也可能会留下一些额外的行在那一分钟添加。

我的解决方案(我在评论中找到了这种方法)是执行以下操作:

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

我不是说这是最好的方法,我只是想到了这个想法。但它似乎给我正在做的事情增加了一种故障保险

如果有人有更好或更合适的解决方案,我将暂时不讨论这个问题。

我的解决方案(我在评论中找到了这种解决方案)是执行以下操作:

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

我不是说这是最好的方法,我只是想到了这个想法。但它似乎给我正在做的事情增加了一种故障保险


如果有人有更好或更合适的解决方案,我会将此选项保留一段时间。

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

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

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

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

很好,您的cron作业只会在午夜运行一次,您根本不需要担心它。实际上,不管是午夜还是任何时候,它都只运行一次。让一个系统依赖于一个作业在午夜运行似乎真的很危险。你应该想另一种方法来实现你的目标。@Evan Carslake:我知道它只运行一次,但我担心的是,因为它运行在午夜,日期时间可能会出错,我可能会得到重复的@戈登·林诺夫:因此这个问题:)我想知道我是否可以在日期时间上加上12个小时,然后将时间设置为
00:00:00
,或者是否有更好的时间way@BrianBruman是的,但我的意思是,午夜只发生一次,和其他时间一样。00:00::00与希望它只在5点05:00:00运行一次没有什么不同。午夜只持续那一秒,然后是00:00:01。你很好…你很好,你的cron作业只会在午夜运行一次,你根本不需要担心。实际上,不管是午夜还是任何时候,它都只运行一次。让一个系统依赖于一个作业在午夜运行似乎真的很危险。你应该想另一种方法来实现你的目标。@Evan Carslake:我知道它只运行一次,但我担心的是,因为它运行在午夜,日期时间可能会出错,我可能会得到重复的@戈登·林诺夫:因此这个问题:)我想知道我是否可以在日期时间上加上12个小时,然后将时间设置为
00:00:00
,或者是否有更好的时间way@BrianBruman是的,但我的意思是,午夜只发生一次,和其他时间一样。00:00::00与希望它只在5点05:00:00运行一次没有什么不同。午夜只持续那一秒,然后是00:00:01。您很好……您也可以通过将字符串传递给strottime()来实现这一点。例如:
日期(“Y-m-d H:i:s”,标准时间(“2018-09-18 00:00:00”)
日期(“Y-m-d H:i:s”,标准时间(“2018-09-18 23:59:59”)也可以通过将字符串传递给strottime()来实现。例如:
日期(“Y-m-d H:i:s”,标准时间(“2018-09-18 00:00:00”)
日期(“Y-m-d H:i:s”,标准时间(“2018-09-18 23:59:59”)