猿问

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

我以前从未见过这样的事情。这是返回预期答案(一系列五个日期)的函数的一部分......有时。例如,它在早上 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 项目的一部分运行,应该考虑到这一点。(应用程序时区设置为“欧洲/伦敦”。)


慕哥6287543
浏览 156回答 2
2回答

蛊毒传说

我不喜欢你如何定义$start和$end。如果我没记错的话,如果服务器时钟恰好在定义的两个变量之间滴答到下一秒,那么您的间隔将是 3 天 23 小时 59 分钟 59 秒,而不是正好 4 天。这会打乱你对$diff->daysto be3而不是 的定义4,导致日期缺失。我在这里建议采用不同的方法。具体来说,从当前日期开始,减去一天所需的次数 - 因为这似乎被硬编码为 5。$date = new DateTime();$interval = new DateInterval("P1D");for( $i=0; $i<5; $i++) {&nbsp; &nbsp; $date->sub($interval);&nbsp; &nbsp; echo $date->format("Y-m-d")."\n";}$i<5当然,可以将其重构$i < DAYS为一些适当的常量定义,以避免“幻数”并允许在未来的开发中进行更改。

翻阅古今

使用 DateTime(以及 strtotime),可以处理“今天 -3 天”等表达式。今天始终是 00:00。计算可以简化如下:$days = 5;for( $i=1; $i<=$days; $i++) {&nbsp; echo date_create("today -$i days")->format('Y-m-d')."<br>\n";}
随时随地看视频慕课网APP
我要回答