企業にとって重要な機能は、サブスクリプション、定期的な支払い、予約などの日付に依存することがよくあります。
PHP プログラマーは、おそらく日付/時刻を操作する必要があるでしょう。
技術を習得し、言語がどのように機能するかを理解するには、ネイティブ API を使い続けることが一般的に良い習慣ですが、現実的になってみましょう。
Carbon は、DateTimeInterface、JsonSerializable、およびその他のネイティブ 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 中国語 Web サイトの他の関連記事を参照してください。