我以前從未見過這樣的事情。這是返回預期答案(一系列五個日期)的函數的一部分......有時。例如,它在早上 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為一些適當的常量定義,以避免“幻數”并允許在未來的開發中進行更改。

翻閱古今
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";
}
- 2 回答
- 0 關注
- 193 瀏覽
添加回答
舉報
0/150
提交
取消