PHPで日付をフォーマットするならCarbonを使おう

のえる のえる
2019.09.13

プログラムを書いていて日付を操作することは非常によくあることです。
また、日付をフォーマットするなんてことは日常茶飯事ですが、日本以外を扱い始めると途端に煩雑になりがちです。

 

今回は PHP で日付を操作するライブラリ Carbon をご紹介します。

 

余談ですが、Carbon は CakePHP3 や Laravel でも使用されています。
(CakePHP3 は3.2.0以前まで使用されていました)

 

◆Carbon に関するリンク

環境

実行環境はこんな感じです。

 

CentOS 7
PHP Version 7.1.11
Composer

 

※Composerのインストールおよび使い方の説明は割愛します
※Linuxの使い方の説明は割愛します

実装方法

インストール

まずは composer で Carbon をインストールします

 

続いて Carbon を使用できるようにします

 

これで Carbon を使用する準備ができました。

現在日時を取得する

現在日時を取得するには下記のような感じになります。

とても簡単ですね。
タイムゾーンを指定しない場合 php.inidate.timezone の値が使用されます。

日時を加減する

日時の加算・減算をしたい場合は下記のような感じです。

お察しかと思いますが、加算は add 、減算は sub です。
あとの項目は Years, Months, Days, Hours, Minutes, Seconds という名前で各項目を操作できます。
さらに Weekdays という名前を使用すると 営業日 で計算ができます。(祝日は計算されません)

 

ただし 月の操作は31日操作する というものですので、加減算時は要注意です。

日時を比較する

2つの日時を比較するには、下記のような感じです。

1つ目のポイントは isSameDayeq です。
一見同じように見えますが isSameDayは日付eqは日時 を見るという違いがあります。
また isSameDayはタイムゾーンを見ませんeqはタイムゾーンを見る などの違いもあります。

 

2つ目のポイントは diff->invert です。
invert は 負の場合に1になる という仕様なので、同じか正の値の場合は0となる点に気をつけましょう。

日時をフォーマットする

日時をフォーマットして出力するには下記のような感じです。

ここでのポイントは 日本語の曜日取得はLocaleを設定する というところでしょうか。
setlocale をコメントアウトするとわかりますが、普通に英語の短縮曜日名が返ってきます。

 

また、フォーマットに関する文字列は date 関数と同じものが使用できます。

その他の便利な情報

大枠で紹介する以外に、このライブラリを使用すると便利な情報が取得できますので、ご紹介していきます。

大体使いそうなものを列挙してみました。
ライブラリの中身を見ていると 誕生日かどうか まであるのはビックリですね。

 

日時を複製する場合、Unixtimeを取得してから新しいオブジェクトを生成しても良いのですが copy を使う方がお手軽です。
copyの場合はUnixtimeと違い、マイクロ秒までコピーされます。

注意点(2020/03/24 追記)

このCarbonで気を付け無ければならない点があります。

 

まずは下記のプログラムを見てください。

 

 

date1に1日加算した日付をdate2として取得したい、という場合に書いたソースコードです。

 

これの結果は下記のようになってしまいます。
(見やすいように整形してます)

 

 

見事にdate1とdate2の日付が1日加算されました。

 

これは Carbonがミュータブルなこと に起因しています。

 

これは copy や clone をすれば解決することではありますが、直感的ではなくなってしまいます。

 

そのため、下記のような方法にすることで、意識せずともバグの発生を回避をすることができます。

 

イミュータブル型Carbonで使用しておく

 

イミュータブル型Carbonに変換してから使う

Composerが使えない・使わない場合

もし環境によりComposerが使えない場合やWindowsで使用する場合など、別の方法でインストールしたい時はこちらの記事をご参照ください。
PhpSpreadsheetを例に挙げた、Composerを使わずに使用する方法を記載しています。

 

さいご

よくある教科書的な書籍やサイトでは date 関数が用いられます。

 

しかし、業務で使用する場合などではどうにも不便になってしまいがち・・・。
また、グローバル化の対応をしようと思うと、日付まわりだけで時間を消費してしまうことも冗談ではありません。

 

そんな時はこの Carbon の使用を検討してみてはいかがでしょうか?

 

※このライブラリを使用しても 2038年問題 の解決にはなりませんので、予めご注意ください。

スポンサーリンク

POPULAR

のえる

のえる

Full-stack Developer