簡體   English   中英

添加跨年的天數時,strtotime 錯誤計算日期

[英]strtotime miscalculates date when adding days that cross year

我需要在日期中添加天數。 我一直很高興地使用以下內容,並且一直使用到年底:

date('o-m-d', strtotime("{$start_date} +6 days"));

例如,當 $start_date 等於 2022-12-19 時,結果為 2022-12-25:

date('o-m-d', strtotime("2022-12-19 +6 days")); // 2022-12-25

當天數落在一年的第一天時,這會變得支離破碎——因此對於 2022-12-26,結果是 2022-01-01(2022 年,而不是 2023 年!)

date('o-m-d', strtotime("2022-12-26 +6 days")); // 2022-01-01, which is incorrect!

玩弄我發現只有當日期落在一年的第一天時 - 這里有一些例子:

date('o-m-d', strtotime("2022-12-30 +1 days")); // 2022-12-31, correct
date('o-m-d', strtotime("2022-12-30 +2 days")); // 2022-01-01, incorrect!
date('o-m-d', strtotime("2022-12-30 +3 days")); // 2023-01-02, correct

date('o-m-d', strtotime("2023-01-03 -1 days")); // 2023-01-02, correct
date('o-m-d', strtotime("2023-01-03 -2 days")); // 2022-01-01, incorrect!
date('o-m-d', strtotime("2023-01-03 -3 days")); // 2022-12-31, correct

我看到當我包含 h:m:s 時,一天中的時間很奇怪,但這肯定會影響所有日期計算。 任何人都知道這里發生了什么? (我正在使用 php@7.4)

我嘗試了各種變體,比如將基准日期作為第二個參數添加到 strtotime,甚至嘗試相對於今天(撰寫本文時為 -11 天),但總是出現相同的錯誤。

需要明確的是,在 2022-12-30 上加上兩天應該是 2023-01-01,而不是 2022-01-01。

我查看了類似問題的其他答案,例如使用

$date = new \DateTime('2022-12-26');
$end_date = date_add($date, date_interval_create_from_date_string("6 days"))->format('o-m-d');

這會導致完全相同的錯誤。

使用Y表示年份,而不是o o是:

ISO 8601 周編號年份。 這與 Y 具有相同的值,除了如果 ISO 周數 (W) 屬於上一年或下一年,則使用那一年。

http://www.php.net/manual/en/datetime.format.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM