PHPで日付関連の処理をするならCarbonを使おう!

シェアする

PHPで日付処理をする場合、date関数DateTimeクラスを使用して日付を求めたりすることが多いと思います。

その方法もありだと思いますが、現在(2018年5月1日)、GitHubで9000近いスターを集めているCarbonを使用するのもおすすめです。

このCarbonはDatetimeクラスをオーバーラップした日付関数ライブラリです。

PHPでは、Chronosという人気のある日付時刻を扱うライブラリーもあります。Chronosの情報が欲しい方は、下記の記事を参照ください。

PHPの日付・時刻ライブラリChronosの機能について紹介しています。Carbonとの違いについても説明しています。

CarbonとChronosの違い

PHPで日付時刻を扱うライブラリーとしてCarbonを使うかChronosを使用するか悩んでいる方もいると思います。
CarbonとChronosの主な違いについて知りたい方は、下記のリンクを参照ください。

CarbonとChronosの違い

Carbonの使用できる環境

・PHP 5.4以上(DateTimeクラスを継承しています)

Carbonのインストール

Composerのインストール

composerを新規登録する場合
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
$ exit
$ composer --version
composer既にインストール済みの場合
$ composer self-update
$ composer --version

Carbonのインストール

composerを使用する場合

composerでCarbonをインストールするためには下記のコマンドを打ち込みます。

composer require nesbot/carbon

これで自動的に最新バージョンのCarbonをインストールされ、composer.jsonファイルに設定されます。

下記の例がCarbonを動かすPHPファイルの例です。これでCarbonを動かすことができます。

<?php
require 'vendor/autoload.php';

use Carbon\Carbon;

printf("Now: %s", Carbon::now());

composer.jsonファイルにしたがって、Carbonをインストールしたい場合は、下記のようなcomposer.jsonファイルを作成して、”composer install”コマンドでCarbonをインストールすることができます。

{
    "require": {
        "nesbot/carbon": "~1.18"
    }
}
直接ダウンロードしてCarbonを使用する場合

ダウンロードしたいCarbonを公式のダウンロードページよりダウンロードします。
ダウンロードしたファイルを配置し、下記のようなPHPプログラムを記載することでCarbonを使用することができます。

<?php
require 'path/to/Carbon/autoload.php';

use Carbon\Carbon;
use Carbon\CarbonInterval;

printf("Now: %s", Carbon::now());

printf("1 day: %s", CarbonInterval::day()->forHumans());

CarbonのパッケージにはsymFony/translationが含まれており、diffForHumansメソッドをさまざまな言語で利用できます。
あなたのPHPバージョンに最も適したsymfony/translation(および将来の依存関係)バージョンを入手し、コンポーザーの更新コマンドによって最新のものを最新の状態に保つことができるので、Composerを使ったインストールの方が、直接ダウンロードしCarbonを使用するより良い選択です。

Carbonの利用例

Carbonでのフォーマット

Carbonでのフォーマットの指定の書式は、date関数()と同じです。
下記に例を示します。

<?php
require 'vendor/autoload.php';
 
use Carbon\Carbon;
 
$carbon = Carbon::create(2018, 5, 30, 11, 22, 33);
echo $carbon; // 2018-05-30 11:22:33
echo $carbon->format('Y年m月d日'); // 2018年05月30日
 
$carbon->setToStringFormat('Y/m/d H:i:s'); // デフォルトフォーマットを変更
echo $carbon; // 2018/05/30 11:22:33
 
$carbon->resetToStringFormat(); //フォーマットをリセットしデフォルトに戻す
echo $carbon; // 2018-05-30 11:22:33
現在日時や指定日時の取得
require 'vendor/autoload.php';

use Carbon\Carbon;

$carbon = new Carbon();
echo $carbon;                            // 2018-05-01 07:13:45 Carbon::now()と同じ
$now = Carbon::now();
echo $now;                               // 2018-05-01 07:13:45
$today = Carbon::today();
echo $today;                             // 2018-05-01 00:00:00
$tomorrow = Carbon::tomorrow('Asia/Tokyo');
echo $tomorrow;                          // 2018-05-02 00:00:00
$yesterday = Carbon::yesterday();
echo $yesterday;                         // 2018-04-30 00:00:00
$parse = Carbon::parse('2018-04-30 10:30:10');
echo $parse;                             // 2018-04-30 10:30:10
Carbonインスタンスから必要な日時を取得
require 'vendor/autoload.php';

use Carbon\Carbon;

$dt = Carbon::parse('2012-9-5 23:26:11.123789');

// These getters specifically return integers, ie intval()
//年を取得
echo $dt->year;                          // 2012
//月を取得
echo $dt->month;                         // 9
//日を取得
echo $dt->day;                           // 5
//時刻を取得
echo $dt->hour;                          // 23
//分を取得
echo $dt->minute;                        // 26
//廟を取得
echo $dt->second;                        // 11
//マイクロ秒を取得
echo $dt->micro;                         // 123789

// 曜日を0(日) から 6 (土)で取得
echo $dt->dayOfWeek;                     // 3
// dayOfWeekIsoは、 1(月) から 7(日)で曜日を取得
echo $dt->dayOfWeekIso;                  // 3

//年のうちその日が何日経った日かを取得
echo $dt->dayOfYear;                     // 248
//その日が月の何週目かを取得
echo $dt->weekNumberInMonth;            // 2
//weekNumberInMonthは月曜日から日曜日までの週を考慮しているため、
//週何週目かは1日が始まる曜日により変わります。日曜日から始まる場合は1日、
//月曜日から始まる場合は7日までが1週目となります。

echo $dt->weekOfMonth;                  //1
//weekOfMonthは1日から7日までを月の1週目と返します。
//なので、2は8日から14日、3は、15日から21日、
//4は、22日から28日そして、5はそれ以上の日にちです。

//年で見た際の経過週
echo $dt->weekOfYear;                  //36
//月の日数
echo $dt->daysInMonth;                 //30
//UNIXタイムスタンプ
echo $dt->timestamp;                  //1346901971
//Carbon::now()の時点で何歳か
echo Carbon::createFromDate(1975, 5, 21)->age; // 42
//四半期
echo $dt->quarter;                    // int(3)
// タイムゾーン名
echo $dt->tzName;                     // Asia/Tokyo

日付の判定
require 'vendor/autoload.php';

use Carbon\Carbon;

//現在のシステム時間を取得(ここの値により下記の判定は変わります)
$dt = Carbon::now();
//$dt2 = Carbon::parse('2012-9-5 23:26:11.123789');

//boolean
//$dtが未来かどうか
$dt->isFuture();
//$dtが過去かどうか
$dt->isPast();

//$dtが今年かどうか
$dt->isCurrentYear();
//$dtが来年かどうか
$dt->isNextYear();
//$dtが去年かどうか
$dt->isLastYear();
//$dtが閏年かどうか
$dt->isLeapYear();

//現在($dt)の四半期かどうか
$dt->isCurrentQuarter();
//現在($dt)が次の四半期かどうか
$dt->isNextQuarter(); // date is in the next quarter
//現在の($dt)が最後の四半期かどうか
$dt->isLastQuarter(); // in previous quarter

//$dtが現在の月かどうか
$dt->isCurrentMonth();
//$dtが来月かどうか
$dt->isNextMonth();
//$dtが先月かどうか
$dt->isLastMonth();

//平日かどうか(デフォルトでは、日本の祝日は未対応だと思います)
$dt->isWeekday();
//週末かどうか(デフォルトだと土日らしい)
$dt->isWeekend();
//月曜かどうか
$dt->isMonday();
//火曜かどうか
$dt->isTuesday();
//水曜かどうか
$dt->isWednesday();
//木曜かどうか
$dt->isThursday();
//金曜かどうか
$dt->isFriday();
//土曜かどうか
$dt->isSaturday();
//日曜かどうか
$dt->isSunday();

//月の最後かどうか
$dt->isLastOfMonth(); // is the last day of the month

//昨日かどうか
$dt->isYesterday();
//今日かどうか
$dt->isToday();
//明日かどうか
$dt->isTomorrow();
//来週かどうか
$dt->isNextWeek();
//先週かどうか
$dt->isLastWeek();
日付の比較
require 'vendor/autoload.php';

use Carbon\Carbon;

$first = new Carbon('2018-05-01');
$second = new Carbon('2018-06-01');

//イコール
var_dump($first->eq($second));                     // bool(false)
//ノットイコール
var_dump($first->ne($second));                     // bool(true)
//より大きい
var_dump($first->gt($second));                     // bool(false)
//以上
var_dump($first->gte($second));                    // bool(false)
//より小さい
var_dump($first->lt($second));                     // bool(true)
//以下
var_dump($first->lte($second));                    // bool(true)

//間
var_dump(Carbon::create(2018, 5, 10, 3)->between($first, $second)); // bool(true)
日付の加算減算
require 'vendor/autoload.php';

use Carbon\Carbon;

$dt = Carbon::create(2012, 1, 31, 0);

echo $dt->toDateTimeString();            // 2012-01-31 00:00:00

//世紀の加算
echo $dt->addCenturies(5);               // 2512-01-31 00:00:00
//1世紀加算
echo $dt->addCentury();                  // 2612-01-31 00:00:00
//世紀の減算
echo $dt->subCentury();                  // 2512-01-31 00:00:00
//5世紀減算
echo $dt->subCenturies(5);               // 2012-01-31 00:00:00

//年の加算
echo $dt->addYears(5);                   // 2017-01-31 00:00:00
//1年の加算
echo $dt->addYear();                     // 2018-01-31 00:00:00
//年の減算
echo $dt->subYear();                     // 2017-01-31 00:00:00
//年の減算
echo $dt->subYears(5);                   // 2012-01-31 00:00:00

//四半期の加算
echo $dt->addQuarters(2);                // 2012-07-31 00:00:00
//一四半期の加算
echo $dt->addQuarter();                  // 2012-10-31 00:00:00
//一四半期の減算
echo $dt->subQuarter();                  // 2012-07-31 00:00:00
//四半期の減算
echo $dt->subQuarters(2);                // 2012-01-31 00:00:00

//月の加算
echo $dt->addMonths(60);                 // 2017-01-31 00:00:00
//1ヶ月の加算
echo $dt->addMonth();                    // 2017-03-03 00:00:00 と同じ $dt->month($dt->month + 1);
//1ヶ月の減算
echo $dt->subMonth();                    // 2017-02-03 00:00:00
//月の減算
echo $dt->subMonths(60);                 // 2012-02-03 00:00:00

//日付の加算
echo $dt->addDays(29);                   // 2012-03-03 00:00:00
//1日の追加
echo $dt->addDay();                      // 2012-03-04 00:00:00
//1日の減算
echo $dt->subDay();                      // 2012-03-03 00:00:00
//日付の減算
echo $dt->subDays(29);                   // 2012-02-03 00:00:00

//平日の加算
echo $dt->addWeekdays(4);                // 2012-02-09 00:00:00
//平日1日の加算
echo $dt->addWeekday();                  // 2012-02-10 00:00:00
//平日1日の減算
echo $dt->subWeekday();                  // 2012-02-09 00:00:00
//平日の減算
echo $dt->subWeekdays(4);                // 2012-02-03 00:00:00

//週の加算
echo $dt->addWeeks(3);                   // 2012-02-24 00:00:00
//1週間の加算
echo $dt->addWeek();                     // 2012-03-02 00:00:00
//1週間の減算
echo $dt->subWeek();                     // 2012-02-24 00:00:00
//週の減算
echo $dt->subWeeks(3);                   // 2012-02-03 00:00:00

//時間の加算
echo $dt->addHours(24);                  // 2012-02-04 00:00:00
//1時間の加算
echo $dt->addHour();                     // 2012-02-04 01:00:00
//1時間の減算
echo $dt->subHour();                     // 2012-02-04 00:00:00
//時間の減算
echo $dt->subHours(24);                  // 2012-02-03 00:00:00

//分の加算
echo $dt->addMinutes(61);                // 2012-02-03 01:01:00
//1分の加算
echo $dt->addMinute();                   // 2012-02-03 01:02:00
//1分の減算
echo $dt->subMinute();                   // 2012-02-03 01:01:00
//分の減算
echo $dt->subMinutes(61);                // 2012-02-03 00:00:00

//秒の加算
echo $dt->addSeconds(61);                // 2012-02-03 00:01:01
//1秒の加算
echo $dt->addSecond();                   // 2012-02-03 00:01:02
//1秒の減算
echo $dt->subSecond();                   // 2012-02-03 00:01:01
//秒の減算
echo $dt->subSeconds(61);                // 2012-02-03 00:00:00
日付の差分
require 'vendor/autoload.php';

use Carbon\Carbon;

$date1 = Carbon::createMidnightDate(2016, 1, 5);
$date2 = Carbon::createMidnightDate(2017, 3, 15);

//秒
echo $date1->diffInSeconds($date2);                 // 37584000	
分
echo $date1->diffInMinutes($date2);                 // 626400
時間
echo $date1->diffInHours($date2);                   // 10440
//日にち
echo $date1->diffInDays($date2);                   // 435
//週
echo $date1->diffInWeeks($date2);                  // 62
//月
echo $date1->diffInMonths($date2);                 // 14
//年
echo $date1->diffInYears($date2);                  // 1
その他

そのほかにCarbonには誕生日を判別するメソッドがあったりします。

require 'vendor/autoload.php';

use Carbon\Carbon;

$born = Carbon::createFromDate(1987, 4, 23);
$yesCake = Carbon::createFromDate(2014, 4, 23);

//誕生日かどうかを判別
var_dump($born->isBirthday($yesCake));             // bool(true)

今回の記事では、Carbonについて紹介しました。
公式サイトのCarbon – A simple PHP API extension for DateTime.にそのほかの様々なCarbonの機能がまとめられています。

興味のある方は、ぜひ、参照して見てください。

シェアする

フォローする