ホームページ > バックエンド開発 > PHPチュートリアル > PHP: デーツ地獄から脱出するための実践的な方法

PHP: デーツ地獄から脱出するための実践的な方法

DDD
リリース: 2024-11-30 09:14:19
オリジナル
157 人が閲覧しました

企業にとって重要な機能は、サブスクリプション、定期的な支払い、予約などの日付に依存することがよくあります。

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 は作成後に変更できません。ほとんどの場合、最初の日付を変更する必要はありません。

コードの他の部分がそのインスタンスに依存している場合、厄介なバグが発生する可能性があります。

不変形式はそのような副作用を防ぎ、通常は読みやすさとテストに優れています。

タイムゾーンを無視しないでください

タイムゾーンを無視すると危険です:

PHP: Practical ways to escape from the hell of Dates

PHP: タイムゾーンを理解する

spO0q・8月4日

#php #初心者 #プログラミング

アプリでデフォルトのタイムゾーンを指定しない場合は、サーバーが決定します。

ただし、アプリケーションは異なるタイムゾーンのサーバーにデプロイされる可能性があります。

また、夏時間や保存形式 (UTC と現地時間など) などの複雑な問題に悩まされることもありますが、適切な実践を奨励するライブラリを使用すると、それほど苦痛ではなくなる可能性があります。

まとめ

ネイティブ API では日付と時刻の高度な操作が可能ですが、Carbon はそれを美しく拡張します。

PHP 開発者は、この追加レイヤーを利用して計算を簡素化し、読みやすさを向上させることができます。

使用するかどうかに関係なく、ネイティブ PHP DateTime オブジェクトのデフォルトの動作を必ず理解してください。

以上がPHP: デーツ地獄から脱出するための実践的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート