企業的關鍵功能通常依賴日期,例如訂閱、定期付款或預訂。
身為 PHP 程式設計師,您可能需要操作日期/時間。
雖然堅持使用本機 API 來掌握技能並了解語言的工作原理通常是一個很好的做法,但讓我們務實一些。
Carbon 是一個功能強大的函式庫,它擴充了 DateTimeInterface、JsonSerialized 和其他原生 PHP 工具。
它為操作現有和新的日期物件提供了有用的幫助器:
// Tomorrow CarbonImmutable::now()->add(1, 'day'); // Copy instance from another API $dateTime = new \DateTime('first day of January 2025'); $carbon = Carbon::instance($dateTime); // Parsing values $date = Carbon::parse('2050-01-01 12:34:00', 'UTC');
Carbon 擴充了原生 API,但 DateTime 物件已經提供了計算日期和時間的工具:
$date = new DateTime('2024-07-23'); $date->add(new DateInterval('P10D')); echo $date->format('Y-m-d'); $date2 = new DateTime('2024-08-03'); $interval = $date->diff($date2); echo $interval->format('%R%a days');
您可以傳遞字串來取得特定輸出或計算間隔和週期。
$yesterday = Carbon::yesterday(); $today = Carbon::today(); $now = Carbon::now(); $tomorrow = Carbon::tomorrow(); $futureDate = Carbon::today()->addDays(21)->format('Y-m-d'); if ($now->isEndOfDay()) { // Some code }
該函式庫對於日期比較來說方便且強大,但很容易出現各種錯誤。
Carbon 可以方便處理語言環境:
$now = Carbon::now()->locale('fr_FR'); echo $now->monthName;
預設的 PHP DateTime 行為在添加或減去月份時可能會產生誤導。它可以溢出!
雖然您有時可能需要這種行為,但 Carbon 提供了更好的控制:
Carbon::useMonthsOverflow(false); Carbon::resetMonthsOverflow();
您也可以在操作年或月時在每個方法中配置溢出(例如,subMonthsNoOverflow、addMonthsWithOverflow)。
由於可變性,日期在單元測試中可能會出現問題。
Carbon 提供了先進的模擬功能,確保測試保持一致且可靠。
這可以防止隨機錯誤破壞 CI/CD 管道。
無論您是否使用 Carbon,都有一些實用的方法可以減少潛在的錯誤和不一致:
PHP 的最新版本引入了更好的日期/時間異常,使您能夠更一致地捕獲意外輸入。
但是,實現有時可以消除嚴重錯誤:
$dateInput = '2dsds'; $timestamp = strtotime($dateInput); echo date('Y-m-d', $timestamp); // Defaults back to 1970-01-01
以下程式碼並不是改進,即使它使用 DateTime 物件:
$dateInput = '2024-02-30'; // Invalid date (February has 28 days, 29 at most) $date = new DateTime($dateInput); echo $date->format('l \t\h\e jS F'); // Outputs "Friday the 1st March"
所以,總是驗證日期/時間:
$dateInput = '2dsds'; $timestamp = strtotime($dateInput); if (false === $timestamp) { throw new InvalidArgumentException(); } echo date('Y-m-d', $timestamp);
並且,深入檢查輸入:
$format = 'Y-m-d'; $dateInput = '2024-02-30'; $dateInfo = date_parse($dateInput); if (!checkdate($dateInfo['day'], $dateInfo['month'], $dateInfo['year'])) { throw new InvalidArgumentException(); } $date = DateTimeImmutable::createFromFormat($format, $dateInput); echo $date->format('l \t\h\e jS F');
DateTimeImmutable 或 CarbonImmutable 建立後無法變更。大多數時候,您不需要更改初始日期。
如果程式碼的其他部分依賴該實例,則可能會引入嚴重的錯誤。
不可變格式可以防止此類副作用,並且通常更有利於可讀性和測試。
忽略時區是有風險的:
如果您未在應用程式中指定預設時區,則伺服器將確定它。
但是,您的應用程式可能部署在不同時區的伺服器上。
您可能還會遇到夏令時或儲存格式(例如,UTC 與當地時間)等複雜問題,如果程式庫鼓勵良好實踐,這可能會減輕一些痛苦。
原生 API 允許對日期和時間進行高級操作,而 Carbon 則對其進行了精美的擴展。
PHP 開發人員可以利用這個附加層來簡化計算並提高可讀性。
無論您是否使用它,請確保您了解本機 PHP DateTime 物件的預設行為。
以上是PHP:逃離日期地獄的實用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!