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

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

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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
トラフィックの高いウェブサイトのPHPパフォーマンスチューニングトラフィックの高いウェブサイトのPHPパフォーマンスチューニングMay 14, 2025 am 12:13 AM

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

PHPでの依存関係注射:初心者向けのコード例PHPでの依存関係注射:初心者向けのコード例May 14, 2025 am 12:08 AM

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

PHPパフォーマンス:アプリケーションを最適化することは可能ですか?PHPパフォーマンス:アプリケーションを最適化することは可能ですか?May 14, 2025 am 12:04 AM

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

PHPパフォーマンスの最適化:究極のガイドPHPパフォーマンスの最適化:究極のガイドMay 14, 2025 am 12:02 AM

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。