为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕哥6287543 2023-07-15 10:19:14
我以前从未见过这样的事情。这是返回预期答案(一系列五个日期)的函数的一部分......有时。例如,它在早上 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-042020-07-032020-07-022020-07-012020-06-30我已经手动运行具有不同日期/时间的代码,并且无法重新创建该错误......但它在生产中每隔几天就会发生一次。这只是普通的 PHP,但它作为 Laravel 项目的一部分运行,应该考虑到这一点。(应用程序时区设置为“欧洲/伦敦”。)
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我不喜欢你如何定义$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++) {

    $date->sub($interval);

    echo $date->format("Y-m-d")."\n";

}

$i<5当然,可以将其重构$i < DAYS为一些适当的常量定义,以避免“幻数”并允许在未来的开发中进行更改。


查看完整回答
反对 回复 2023-07-15
?
翻阅古今

TA贡献1780条经验 获得超5个赞

使用 DateTime(以及 strtotime),可以处理“今天 -3 天”等表达式。今天始终是 00:00。计算可以简化如下:


$days = 5;

for( $i=1; $i<=$days; $i++) {

  echo date_create("today -$i days")->format('Y-m-d')."<br>\n";

}


查看完整回答
反对 回复 2023-07-15
  • 2 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信