Laravel Time Mistake? 時間邏輯判斷
Laravel Time Mistake? 時間邏輯判斷

Laravel Time Mistake? 時間邏輯判斷

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