PHPのプログラムで日付や時刻を扱うなら、Carbonを使ってみてはいかがでしょうか。Carbonは、簡単に使えるうえ便利な機能が幾つもあり、PHP初心者でも使えるライブラリです。とはいえ、ライブラリを使うのは難しいのでは、と感じている方もいるでしょう。
そこで今回は、日付や時刻を扱うライブラリCarbonの機能とその使い方について、例を用いて詳しく解説します。
目次
日付や時刻を扱うライブラリCarbon
PHPのプログラムを作成する際、日付や時刻のプログラムを作るのが面倒だと感じたことはありませんか。もし、そう感じたことがあるのなら、ぜひ、Carbonを使ってみてください。
Carbonを使うと日付や時刻を扱う際に便利な機能がたくさんあることが解ると思います。まずは、Carbonの基本について解説します。
Carbonの機能
Carbonは、ブライアン・ネスビットさんが作成し公開している、PHPのDateTimeクラスをオーバーラップした日付操作のためのライブラリです。
PHPに限らず、日付の比較や日時の計算のためのプログラムは、文字列の日付や時間とコンピュータのシステム時計の数値の両方を扱うことから、面倒な処理が必要です。
その点、Carbonを利用することで、日時を扱うプログラムを簡潔に書けることから人気が高く、多くのエンジニアに支持されています。
Carbonの名前の由来
日付操作のためのライブラリが、なぜCarbonという名称、と不思議に思われた方もいるでしょう。英語のCarbonは、日本語では炭素です。炭素が日時とどのような関係があるのでしょうか。
実は、炭素は、放射性炭素年代測定を用いて、化石の年代測定に使われる元素です。詳しい説明は省きますが、化石にふくまれる放射性炭素の量を測定することで、その化石がどれだけ古いものか測定できます。
そのような炭素の特徴から、日付操作のためのライブラリの名称をCarbonとしたとのことです。
Carbonを使う準備
先ほど説明したように、CarbonはPHP向けのライブラリです。そのため、標準のPHPには含まれていないので、GitHubからダウンロードし、自分のPHP開発環境に組み込んで利用します。
なお、Carbonを組み込む際、composerを利用したインストールが推奨されているので、この機会に、ぜひ、composerの使い方もマスターしてください。composerは、公式サイトにインストール方法が紹介されており、Linuxならyumやaptコマンドでもインストール可能です。ぜひ、自分の開発環境に合わせてインストールしてください。
そして、composerでCarbonをインストールするコマンドは、次のとおりです。なお、このコマンドは、作業するディレクトリで実行してください。
1 |
$ composer require nesbot/carbon |
Carbonの使い方
composerを使ってインストールしたCarbonをPHPによる開発で利用するためには、autoloadの仕組みを利用してライブラリを読み込む必要があります。さらに、autoloadでは、useコマンドでCarbonを参照するための宣言も必要です。
次から、具体例を使ってCarbonの使い方を紹介します。
ライブラリを利用するための設定
先ほど紹介したように、composerコマンドを使ってCarbonをインストールすると、作業ディレクトリにautoloadのためファイルがvendorの下に用意されます。Carbonを利用するには、venor/autoload.phpで読み込んでください。
また、Carbonを利用するためには、読み込んだライブラリをPHPのプログラム内で使えるように、useコマンドで参照設定を実施します。下記にPHPの設定例を紹介するので、参考にしてください。
Carbonを使う設定例
1 2 3 |
<?php require 'vendor/autoload.php'; use Carbon\Carbon; |
スコープ定義演算子で参照する
Carbonの機能を利用する方法は幾つかありますが、その機能を簡単に使うとしたら、スコープ定義演算子でメソッドを利用する方法が便利です。例えば、今日の日付や明日の日付、明日の日付は、Carbonに続けてスコープ定義演算子の「::」でメソッドを指定するだけで、簡単に作れます。
スコープ定義演算子で参照する例
1 2 3 4 5 6 7 8 |
require 'vendor/autoload.php'; use Carbon\Carbon; echo Carbon::today() . "\n"; // 今日の午前0時の日時を表示 例:2021-01-01 00:00:00 echo Carbon::tomorrow() . "\n"; // 明日の午前0時の日時を表示 例:2021-01-02 00:00:00 echo Carbon::yesterday() . "\n"; // 昨日の午前0時の日時を表示 例:2020-12-31 00:00:00 |
newコマンドでインスタンスする
Carbonでは、指定した日付を基に日付計算などをやるために、newコマンドでインスタンスして、定義されたメソッドを利用することも可能です。
例えば、下記のように日付を指定してインスタンスすることで、日付のフォーマットを変えたり、指定した日付の何日後を計算したりできます。
インスタンスして利用する例
1 2 3 4 5 6 7 8 |
require 'vendor/autoload.php'; use Carbon\Carbon; $dt = Carbon("2021-01-01"); echo $dt->format('Y年m月d日') . "\n"; // 今日の午前0時の日時を表示 例:2021年01月01日 echo $dt->addDays(7)->format("Y年m月d日') . "\n"; // 明日の午前0時の日時を表示 例:2021年01月08日 |
なお、Carbonには、上記の例で紹介した機能の他にも、日付や時間を扱うための多くのメソッドが用意されています。詳しくは、公式サイトのドキュメントなどをチェックしてみてください。
Carbon – A simple PHP API extension for DateTime.
Carbonを使う場合の注意点
PHPで日付や時間を扱うライブラリとして広く使われているCarbonですが、注意してほしい点もあります。そこで、特に注意してほしい点について紹介します。
加減算の結果で元の日時が変わる
先ほど紹介したように、Carbonのメソッドを利用すると、日付や時間の加減算を解り易く記述できます。しかし、その加減算の結果により、元の日付や時間が上書きされているので注意してください。
例えば、ある日付の10日後を計算したとします。すると、元の日付が10日後に上書きさえています。ある日付の20日後を計算したい場合は、定義しなおして計算しなければなりません。
1 2 3 4 5 |
$dt = Carbon("2020-01-01"); // 10日後 $after_10d = $dt->addDay(10); // $after_10dに「2020-01-10」が格納され、$dtも変化している // さらに10日後 $after_20d = $dt->addDay(10); // $after_20dに「2020-01-20」が格納され、$dtも変化している |
この例では、$after_10dに「2020-01-10」が格納されますが、addDay(10)メソッドにより、$dtも「2020-01-10」に変わっています。そのため、さらにaddDay(10)メソッドを実行すると、$dtも「2020-01-20」に変わっています。
もし、10日後と20日後を同時に計算するためには、次のように、2つの変数を利用してください。
1 2 3 4 5 6 |
$dt1 = Carbon("2020-01-01"); $dt2 = Carbon("2020-01-01"); // 10日後 $after_10d = $dt1->addDay(10); // $after_10dに「2020-01-10」が格納される // 20日後 $after_20d = $dt2->addDay(20); // $after_20dに「2020-01-20」が格納される |
Nヵ月後を計算する場合
Carbonは、DateTimeクラスの機能をそのまま使っています。そして、DateTimeクラスで間違い易いことでよく知られている機能が、modifyメソッドで月の計算をやった場合のオーバーフローの処理です。具体的には、30日に満たない2月も、30日として日付計算してしまうので、1月31日の1ケ月後を計算すると3月3日になってしまいます。
そのため、CarbonでNヵ月後の日付を計算するのなら、オーバーフローしないメソッドのaddMonthsNoOverflowを利用してください。
1 2 3 |
$dt = Carbon("2020/01/31"); $dt->addMonthNoOverflow(1); echo($dt->format("Y/m/d") . "^n"); // 結果は「2020/2/28」です |
まとめ
これまで解説したように、Carbonは、PHPで日付や時間を扱う処理を解り易く記述できるライブラリです。標準のPHPには組み込まれいませんが、GitHubで公開されており、多くの方が利用しています。もし、日付や時刻を扱うプログラムを書く機会があれば、ぜひ、利用を検討してください。
ただし、今回説明したように、注意が必要な点もあります。もし、利用する際は、その点をよく理解したうえで、Carbonの日付や時刻を扱う多くの機能を活用してください。