php - 此功能是否有任何日期/时间可能会中断?

标签 php laravel datetime

我以前从未见过这样的事情。这是返回预期答案(一系列五个日期)的函数的一部分......有时。例如,它在早上 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/

相关文章:

php - 如何保护 PHP 和 Android 之间的连接

php - 如何使用php检查用户是否在网站上空闲

java - 计算前一个午夜的 unix 时间戳

MySQL STR_TO_DATE 给出无效结果?

mysql - 选择按周筛选的 SQL 数据

javascript - php 联系表单返回字段名称而不是值

php - 使用多个 php.ini 文件时安装 Pecl

laravel - 如何在 Laravel 中禁用密码提醒电子邮件

php - Laravel 关系并在结果集中为每个关系获取前几个条目

mysql - 如何使用 'cascade' 删除用户并自动删除他的所有关系?