首頁 > 後端開發 > php教程 > PHP:逃離日期地獄的實用方法

PHP:逃離日期地獄的實用方法

DDD
發布: 2024-11-30 09:14:19
原創
249 人瀏覽過

企業的關鍵功能通常依賴日期,例如訂閱、定期付款或預訂。

身為 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 建立後無法變更。大多數時候,您不需要更改初始日期。

如果程式碼的其他部分依賴該實例,則可能會引入嚴重的錯誤。

不可變格式可以防止此類副作用,並且通常更有利於可讀性和測試。

不要忽視時區

忽略時區是有風險的:

PHP: Practical ways to escape from the hell of Dates

PHP:了解時區

spO0q ・ 8 月 4 日

#php #初學者 #程式設計

如果您未在應用程式中指定預設時區,則伺服器將確定它。

但是,您的應用程式可能部署在不同時區的伺服器上。

您可能還會遇到夏令時或儲存格式(例如,UTC 與當地時間)等複雜問題,如果程式庫鼓勵良好實踐,這可能會減輕一些痛苦。

包起來

原生 API 允許對日期和時間進行高級操作,而 Carbon 則對其進行了精美的擴展。

PHP 開發人員可以利用這個附加層來簡化計算並提高可讀性。

無論您是否使用它,請確保您了解本機 PHP DateTime 物件的預設行為。

以上是PHP:逃離日期地獄的實用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板