我以前从未见过这样的事情。这是返回预期答案(一系列五个日期)的函数的一部分......有时。例如,它在早上 6 点运行,结果有时不正确:五个日期中的一个,无论是第一个还是最后一个,可能会丢失。其他时候,还好。相同的代码,几个小时后运行。
我知道处理日期可能比最初出现的要复杂得多,但这让我很难过。我只能希望我对 DateTime 对象的缺乏经验是罪魁祸首。
$start = new \DateTime(date("Y-m-d", strtotime("-1 day")));
$end = new \DateTime(date("Y-m-d", strtotime("-5 days")));
$diff = $end->diff($start);
$interval = \DateInterval::createFromDateString('-1 day');
$period = new \DatePeriod($start, $interval, $diff->days);
foreach($period as $date) {
echo $date->format("Y-m-d"); // Sometimes first or last date will be missing
}
例如,如果代码在 2020-07-05 00:00:00
之间运行和 2020-07-05 23:59:59
,它应该返回最后五个日期:2020-07-04
2020-07-03
2020-07-02
2020-07-01
2020-06-30
我已经手动运行了具有各种日期/时间的代码,但我无法重新创建错误......但它在生产中每隔几天就会发生一次。这只是普通的 PHP,但它是作为 Laravel 项目的一部分运行的,如果有这个因素的话。 (应用时区设置为“欧洲/伦敦”。)
最佳答案
我不喜欢你如何定义 $start
和 $end
.如果我没记错的话,如果服务器时钟恰好在定义的两个变量之间滴答作响,那么您的间隔将是 3 天 23 小时 59 分 59 秒 - 而不是 4 天。这搞乱了你对 $diff->days
的定义成为 3
而不是 4
,导致日期丢失。
我会在这里建议一种不同的方法。具体来说,从当前日期开始,减去一天所需的次数 - 因为这似乎被硬编码为 5。
$date = new DateTime();
$interval = new DateInterval("P1D");
for( $i=0; $i<5; $i++) {
$date->sub($interval);
echo $date->format("Y-m-d")."\n";
}
那个$i<5
当然可以重构为$i < DAYS
对于一些适当的常量定义,以避免“魔数(Magic Number)”并允许在 future 的发展中发生变化。
关于php - 此功能是否有任何日期/时间可能会中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62759306/