php laravel 時間邏輯判斷 怎麼跟我想的不一樣
小小記錄一下前陣子踩到的時間坑,剛剛好工作項目很容易遇到時間問題,稍微記錄一下
$start_date = Carbon::createFromFormat('Ym', '202502', 'Asia/Taipei')
->startOfMonth()
->format('Y-m-d');
這段程式乍看之下沒什麼問題?
但自己在測試的時候發現時間跟我預想的不太一樣
- 理想 > 2025-02-01
- 實際 > 2025-03-01
本來已經想說使用內部套件應該問題少很多了,結果隨手測到這個問題
我把輸入年份更改為202402
發現
- 202402 > 2024-02-01
- 202502 > 2025-03-01
才發現原來套件會保留你當下的日(現在全世界都知道我在29日debug了嗎XD)
我當時是29日,但2025年02月並沒有29日,導致程式內部會自動轉為有效日期,也就是三月
- ChatGBT版本解釋XD也是跟AI討論了好一下
- 在你 createFromFormat('Ym', '202502') 時,Carbon 保留了今天的「日」,如果今天是 4 月 29 日,那麼 day=29,但 2025/2 沒有 29日,所以 Carbon 自動變成 2025/03/01。
最後的最後,
套件很方便,但保險的做法還是把格式加上日以後再進行其他邏輯的轉換
use Carbon\Carbon;
$start_date = Carbon::createFromFormat('Ymd', $YYYYMM . '01')
->format('Y-m-d');
echo $start_date;
跟AI討論還有另外一個做法,但這個我還沒驗證過就是了,可能之後看有沒有遇到需要使用的地方
function parseYearMonth(string $ym): Carbon\Carbon
{
return Carbon\Carbon::createFromFormat('Ym', $ym)
->startOfMonth()
->setDay(1)
->setTime(0, 0, 0);
}
// 使用
$date = parseYearMonth('202502');
echo $date->format('Y-m-d'); // 2025-02-01