LaravelとPHPでCarbonを使用して日時を管理する方法
序章
PHPでの日付と時刻の操作は複雑になる可能性があります。 strtotime
、フォーマットの問題、多くの計算などに対処する必要があります。
Carbon パッケージを使用すると、PHPでの日付と時刻の処理がはるかに簡単になり、よりセマンティックになり、コードがより読みやすく、保守しやすくなります。
Carbonは、PHP独自のDateTimeクラスを拡張するBrianNesbitによるパッケージです。
PHPで日付を処理するためのいくつかの優れた機能を提供します。 具体的には次のようなものです。
- タイムゾーンの処理。
- 現在の時刻を簡単に取得できます。
- 日時を読みやすいものに変換します。
- 英語のフレーズを日時に解析します(
"first day of January 2016"
)。 - 日付の加算と減算(
"+ 2 weeks"
、"-6 months"
)。 - 日付を扱うセマンティックな方法。
この記事では、Carbonをインストールし、Carbonが提供する機能について説明します。
前提条件
このガイドに従うには、次の前提条件を満たしている必要があります。
- 動作するLaravel開発環境。 これを設定するには、 Ubuntu20.04にLaravelアプリケーションをインストールして構成する方法に関するガイドに従ってください。 または、Larvelのインストールドキュメントに従ってください。 Laravel Sailアプローチを選択した場合は、Dockerが必要になります。
このチュートリアルは、PHP v8.0.5、Composer v2.0.13、MySQL 8.0.24、Laravel v8.40.0、およびCarbonv2.31で検証されました。
プロジェクトの設定
Carbonを使用するには、Carbon
名前空間からCarbonをインポートする必要があります。 幸いなことに、CarbonはすでにLaravelに含まれています。
Carbonを使用する必要があるときはいつでも、次のようにインポートできます。
<?php use Carbon\Carbon;
インポートした後、Carbonが提供するものを調べてみましょう。
特定の日時を取得する
現在の時刻を取得します。
$current = Carbon::now();
現在の時刻は、このインスタンス化で取得することもできます。
$current2 = new Carbon();
今日の日付を取得します。
$today = Carbon::today();
昨日の日付を取得します。
$yesterday = Carbon::yesterday();
明日の日付を取得します。
$tomorrow = Carbon::tomorrow();
特定の文字列を解析します。
$newYear = new Carbon('first day of January 2016');
これは次を返します:
Output2016-01-01 00:00:00
これらのヘルパーは、today()
、yesterday()
、tomorrow()
などの頻繁な日時のニーズに対して人間が読める形式のリクエストを提供します。
よりきめ細かい制御で日付を作成する
日付と時刻をすばやく定義する方法に加えて、Carbonでは特定の数の引数から日付と時刻を作成することもできます。
createFromDate()
は$year
、$month
、$day
、$tz
(タイムゾーン)を受け入れます。
Carbon::createFromDate($year, $month, $day, $tz);
createFromTime()
は、$hour
、$minute
、$second
、および$tz
(タイムゾーン)を受け入れます。
Carbon::createFromTime($hour, $minute, $second, $tz);
create()
は、$year
、$month
、$day
、$hour
、$minute
、$second
、[ X84X] (タイムゾーン):
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
これらは、Carbonでは通常認識されない形式である種の日付または時刻を取得する場合に非常に役立ちます。 これらの属性のいずれかにnull
を渡すと、デフォルトで現在になります。
日付と時刻の操作
日付を操作するときに行う必要があるのは、日付と時刻を取得することだけではありません。 多くの場合、日付または時刻を操作する必要があります。
たとえば、ユーザーの試用期間を作成する場合、一定の時間が経過すると試用期間を終了する必要があります。 つまり、30日間の試用期間があるとしましょう。 その時間をCarbonのadd
とsubtract
で計算できます。
この例では、addDays()
を使用して、試用期間がいつ期限切れになるかを判断できます。
// get the current time $current = Carbon::now(); // add 30 days to the current time $trialExpires = $current->addDays(30);
カーボンドキュメントから、他のadd()
およびsub()
メソッドのいくつかを利用できます。
2012年1月31日に設定された日付を考えてみましょう。
$dt = Carbon::create(2012, 1, 31, 0); echo $dt->toDateTimeString();
これは戻ります:
Output2012-01-31 00:00:00
addYears()
およびsubYears()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addYear();
|
2012-01-31 00:00:00 |
echo $dt->addYears(5);
|
2017-01-31 00:00:00 |
echo $dt->subYear();
|
2011-01-31 00:00:00 |
echo $dt->subYears(5);
|
2007-01-31 00:00:00 |
addMonths()
およびsubMonths()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addMonth();
|
2012-03-03 00:00:00 |
echo $dt->addMonths(60);
|
2017-01-31 00:00:00 |
echo $dt->subMonth();
|
2011-12-31 00:00:00 |
echo $dt->subMonths(60);
|
2007-01-31 00:00:00 |
「1月31日」に1か月を追加すると、「2月28日」ではなく「3月3日」になることに注意してください。 そのロールオーバーを使用したくない場合は、addMonthWithoutOverflow()
を使用できます。
addDays()
およびsubDays()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addDay();
|
2012-02-01 00:00:00 |
echo $dt->addDays(29);
|
2012-02-29 00:00:00 |
echo $dt->subDay();
|
2012-01-30 00:00:00 |
echo $dt->subDays(29);
|
2012-01-02 00:00:00 |
addWeekdays()
およびsubWeekdays()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addWeekday();
|
2012-02-01 00:00:00 |
echo $dt->addWeekdays(4);
|
2012-02-06 00:00:00 |
echo $dt->subWeekday();
|
2012-01-30 00:00:00 |
echo $dt->subWeekdays(4);
|
2012-01-25 00:00:00 |
addWeeks()
およびsubWeeks()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addWeek();
|
2012-02-07 00:00:00 |
echo $dt->addWeeks(3);
|
2012-02-21 00:00:00 |
echo $dt->subWeek();
|
2012-01-24 00:00:00 |
echo $dt->subWeeks(3);
|
2012-01-10 00:00:00 |
addHours()
およびsubHours()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addHour();
|
2012-01-31 01:00:00 |
echo $dt->addHours(24);
|
2012-02-01 00:00:00 |
echo $dt->subHour();
|
2012-01-30 23:00:00 |
echo $dt->subHours(24);
|
2012-01-30 00:00:00 |
addMinutes()
およびsubMinutes()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addMinute();
|
2012-01-31 00:01:00 |
echo $dt->addMinutes(61);
|
2012-01-31 01:01:00 |
echo $dt->subMinute();
|
2012-01-30 23:59:00 |
echo $dt->subMinutes(61);
|
2012-01-30 22:59:00 |
addSeconds()
およびsubSeconds()
で日付を変更すると、次のようになります。
指示 | 出力 |
---|---|
echo $dt->addSecond();
|
2012-01-31 00:00:01 |
echo $dt->addSeconds(61);
|
2012-01-31 00:01:01 |
echo $dt->subSecond();
|
2012-01-30 23:59:59 |
echo $dt->subSeconds(61);
|
2012-01-30 23:58:59 |
Carbonのadd
およびsubtract
ツールを使用すると、調整された日付と時刻を提供できます。
ゲッターとセッターの使用
時間を読み取ったり操作したりする別の方法は、Carbonのゲッターとセッターを使用することです。
ゲッターで値を読み取ります。
$dt = Carbon::now(); var_dump($dt->year); var_dump($dt->month); var_dump($dt->day); var_dump($dt->hour); var_dump($dt->second); var_dump($dt->dayOfWeek); var_dump($dt->dayOfYear); var_dump($dt->weekOfMonth); var_dump($dt->daysInMonth);
セッターで値を変更します。
$dt = Carbon::now(); $dt->year = 2015; $dt->month = 04; $dt->day = 21; $dt->hour = 22; $dt->minute = 32; $dt->second = 5; echo $dt;
セッターをつなぐこともできます。
year()
、month()
、day()
、hour()
、minute()
、およびsecond()
を使用した前の例を次に示します。
$dt->year(2015)->month(4)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
setDate()
とsetTime()
を使用した同じ例を次に示します。
$dt->setDate(2015, 4, 21)->setTime(22, 32, 5)->toDateTimeString();
setDateTime()
を使用した同じ例を次に示します。
$dt->setDateTime(2015, 4, 21, 22, 32, 5)->toDateTimeString();
これらのアプローチはすべて同じ結果を生成します:2015-04-21 22:32:05
。
日付と時刻のフォーマット
PHPのtoXXXString()
メソッドは、事前定義されたフォーマットで日付と時刻を表示するために使用できます。
指示 | 出力 |
---|---|
echo $dt->toDateString();
|
2015-04-21 |
echo $dt->toFormattedDateString();
|
2015年4月21日 |
echo $dt->toTimeString();
|
22:32:05 |
echo $dt->toDateTimeString();
|
2015-04-21 22:32:05 |
echo $dt->toDayDateTimeString();
|
2015年4月21日火曜日22:32 |
PHPのDateTime
format()をカスタムフォーマットに使用することもできます。
echo $dt->format('l jS \of F Y h:i:s A');
l
:曜日の完全なテキスト表現。jS
: 先行ゼロのない月の日。 その月の日の英語の序数接尾辞、2文字。F
:月の完全なテキスト表現。Y
:1年の完全な数値表現、4桁。h:i:s
: 先行ゼロを含む1時間の12時間形式。 先行ゼロのある分。 先行ゼロのある秒。A
:大文字のアンティメリディエムとポストメリディエム。
このコードは次の結果を生成します。
OutputTuesday 21st of April 2015 10:32:05 PM
Carbonのフォーマットツールを使用すると、ニーズに合わせて日付と時刻を表示できます。
相対時間の計算
Carbonでは、diff()
メソッドを使用して時間を相対的に表示することもできます。
たとえば、ブログがあり、3 hours ago
の公開時刻を表示したいとします。 これらの方法でそれを行うことができます。
違いを見つける
次の例で、将来の時間と過去の時間を考えてみましょう。
$dt = Carbon::create(2012, 1, 31, 0); $future = Carbon::create(2012, 1, 31, 0); $past = Carbon::create(2012, 1, 31, 0); $future = $future->addHours(6); $past = $past->subHours(6);
diffInHours()
を使用した結果は次のとおりです。
指示 | 出力 |
---|---|
echo $dt->diffInHours($future);
|
6
|
echo $dt->diffInHours($past);
|
6
|
将来の日付と過去の日付を持つ次の例を考えてみましょう。
$dt = Carbon::create(2012, 1, 31, 0); $future = Carbon::create(2012, 1, 31, 0); $past = Carbon::create(2012, 1, 31, 0); $future = $future->addMonth(); $past = $past->subMonths(2);
diffInDays()
を使用した結果は次のとおりです。
指示 | 出力 |
---|---|
echo $dt->diffInDays($future);
|
31
|
echo $dt->diffInDays($past);
|
61
|
人間の違いを表示する
時間を比較的表示すると、日付やタイムスタンプよりも読者にとって便利な場合があります。
たとえば、8:12 AM
のように投稿の時刻を表示する代わりに、時刻は3 hours ago
と表示されます。
diffForHumans()
メソッドは、差を計算し、それを人間が読める形式に変換するために使用されます。
将来の日付と過去の日付を持つ次の例を考えてみましょう。
$dt = Carbon::create(2012, 1, 31, 0); $future = Carbon::create(2012, 1, 31, 0); $past = Carbon::create(2012, 1, 31, 0); $future = $future->addMonth(); $past = $past->subMonth();
diffForHumans()
を使用した結果は次のとおりです。
指示 | 出力 |
---|---|
echo $dt->diffForHumans($future);
|
1 month before
|
echo $dt->diffForHumans($past);
|
1 month after
|
結論
この記事では、Carbonをインストールし、Carbonが提供する機能について説明しました。
Laravelについて詳しく知りたい場合は、Laravelトピックページで演習とプログラミングプロジェクトを確認してください。 PHPについて詳しく知りたい場合は、PHPトピックページで演習とプログラミングプロジェクトを確認してください。