バックエンド

『Carbon』でよく使うパターンをまとめてみた【Laravel向け】

PHPの日付ライブラリと言えば『Carbon(カーボン)』。

PHPのDateTimeクラスを拡張したパッケージで、
日付や時間をよりシンプルに操作できるようになっています。

『Laravel』にも標準で搭載されていて、
created_atやupdated_atはCarbonインスタンスとして取得されます。

『Laravel』講座を作成するにあたり、
『Carbon』の構文をしょっちゅうググっていたので、
備忘録がてらよく使うパターンをまとめておくことにしました。

Carbonのインストール

『Laravel』を使っていれば標準でインストール済みです。
『Laravel』なしの環境ならcomposerで以下のコマンドでインストールできます。

$ composer require nesbot/carbon

Carbonの読み込み

『Laravel』ならautoload済みなのでuse文のみ記載すればOKです。

require 'vendor/autoload.php'; // Laravelの場合は不要

use Carbon\Carbon;

Cabon単独の利用

Carbonインスタンスを生成

new で生成するか 静的メソッドでも作成可能です。

$date = new Carbon();
$date = Carbon::now(); // 現在時刻

引数に文字列を指定すると、様々なインスタンスを取得できます。

new Carbon('today'); // 今日
new Carbon('tomorrow'); // 明日
new Carbon('yesterday'); // 昨日
new Carbon('now'); // 今
new Carbon('last month'); // 前の月
new Carbon('next year'); // 次の年
new Carbon('+1 day'); // 1日後
new Carbon('-2 weeks'); // 2週間前
new Carbon('+3 minutes'); // 3分後
new Carbon('-4 seconds'); // 4秒前
new Carbon('+5 years'); // 5年後
new Carbon('-6 months'); // 6ヵ月前
new Carbon('2021-01-01'); // 2021年1月1日
new Carbon('2021-01-01 01:02:03'); // 2021年1月1日 01時02分03秒

パース(解析)・・文字列からインスタンス作成

こちらでも日付データ生成可能です、引数の文字列は上と同じです。

$date = Carbon::parse('now');

日時を取得

メソッドをつなげる事で表記を変更できます。

$date = Carbon::now();

$date->year; // 2021
$date->month; // 5
$date->day; // 6
$date->hour; // 11
$date->minute; // 22
$date->second; //56
$date->format('Y年m月d日'); // 2021年05月06日

$date->dayOfWeek; // 0。週のうちの何日目か 0 (日曜)から 6 (土曜)
$date->dayOfYear; // 121。年のうちの何日目か 0から開始
$date->weekOfMonth; // 1。月のうちの何週目か
$date->weekOfYear; // 17。年のうちの何週目か
$date->daysInMonth; // 31。 月の日数
$date->quarter; // 2。 // 四半期
$date->timestamp; //1462069596 タイムスタンプ
$date->tzName; // Asia/Tokyo タイムゾーン名

日付の判定(is)

$date = Carbon::now();

var_dump($date->isToday()); // true 今日かどうか
var_dump($date->isTomorrow()); // 明日かどうか
var_dump($date->isYesterday()); // 昨日かどうか
var_dump($date->isFuture()); // 未来かどうか
var_dump($date->isPast()); // 過去かどうか
var_dump($date->isLeapYear()); // うるう年かどうか
var_dump($date->isWeekday()); // 平日かどうか
var_dump($date->isWeekend()); // 週末かどうか デフォルトで土日が週末のよう。

// 週末の定義
$date->setWeekendDays([
    Carbon::MONDAY,
    Carbon::TUESDAY,
    Carbon::WEDNESDAY,
    Carbon::THURSDAY,
    Carbon::FRIDAY,
    Carbon::SATURDAY,
    Carbon::SUNDAY,
]);

// 全部設定するといつでもtrue
var_dump($date->isWeekend()); // true


// 同じ日かどうか
var_dump($date->isSameDay(Carbon::parse('2021-05-06'))); // false

var_dump($date->isSunday()); // 日曜かどうか
var_dump($date->isMonday()); // 月曜かどうか
var_dump($date->isTuesday()); // 火曜かどうか
var_dump($date->isWednesday()); // 水曜かどうか
var_dump($date->isThursday()); // 木曜かどうか
var_dump($date->isFriday()); // 金曜かどうか
var_dump($date->isSaturday()); // 土曜かどうか

日付の比較(gt, ltなど)

大なり、小なり、イコールなどを、
英語で greater than, lower than, equalなどの頭文字をとって、
gt, gte, lt, lte, eq, などのメソッドで実現しています。)

$date1 = new Carbon('2021-05-05');
$date2 = new Carbon('2021-06-05');

var_dump($date1->eq($date2)); // false イコール
var_dump($date1->gt($date2)); // より大きい
var_dump($date1->gte($date2)); // 以上
var_dump($date1->lt($date2)); // より小さい
var_dump($date1->lte($date2)); // 以下

// 日付が2つの日付の間にあるか
var_dump(Carbon::parse('2021-05-15')->between($date1, $date2)); // true

日時の加算・減算(add, sub)

/** 加算 **/

$date = new Carbon('2021-05-01');

$date->addDay(); // 1日後
$date->addMonth(); // 1ヶ月後(5/31の場合7/1)
$date->addMonthNoOverflow(); // 1か月後(5/31の場合6/30)
$date->addYear(); // 1年後
$date->addYearNoOverflow(); // 1年後(5/31の場合6/30)
$date->addHour(); // 1時間後
$date->addSecond(); // 1秒後

$date->addDay(5); // 5日後
$date->addMonth(5); // 5ヶ月後
$date->addYear(5); // 5年後
$date->addHour(5); // 5時間後
$date->addSecond(5) ; // 5秒後

/** 減算 **/

$date = new Carbon('2016-05-01');

$date->subDay(); // 1日前
$date->subMonth(); // 1ヶ月前
$date->subYear(); // 1年前
$date->subHour(); // 1時間前
$date->subSecond(); // 1秒前
$date->subDay(5); // 5日前
$date->subMonth(5); // 5ヶ月前
$date->subYear(5); // 5年前
$date->subHour(5); // 5時間前
$date->subSecond(5); // 5秒前

日時の差分・相対時間 (diff)

$date1 = new Carbon('2021-05-01');
$date2 = Carbon::parse('2021-05-01')->endOfYear();

$date1->diffInSeconds($date2); // 秒
$date1->diffInMinutes($date2); // 分
$date1->diffInHours($date2); // 時間
$date1->diffInDays($date2); // 日
$date1->diffInWeeks($date2); // 週
$date1->diffInYears($date2); // 年
$date1->diffForHumans($date2); // 何日前、何ヶ月後など切り替えて表示

// 2021-05-01から年末まで平日が何日あるか
 $date1->diffInDaysFiltered(function(Carbon $date) {
    return $date->isWeekday();
}, $date2); // 175日

copyメソッド

コピーを作ることで、
元のインスタンスに影響しない方法をとる事もできます。

$date = new Carbon('2021-05-01');

// インスタンスのコピーを作る
$date->copy()->subDay(); // 2021-04-30 00:00:00

// 元のインスタンスには影響がない
$date->subDay(); // 2021-04-30 00:00:00

Laravelの機能との組み合わせ

LaravelのBlade内で直接Carbonを呼び出す

マスタッシュ{{}} 内に Carbon\CarbonとつければOKです。

{{ \Carbon\Carbon::now()->format("Y年m月d日") }}    // 2019年03月05日

Eloquent/QueryBuilderとの組み合わせ

日付を使った検索をしたい時は、
QueryBuilder(クエリビルダ)の『whereDate』メソッドを使うと便利です。

// 等号・不等号なし
$items = Item::query()
    ->whereDate('created_at', Carbon::today()->addMonthNoOverflow())
    ->get();

// 等号・不等号あり
$items = Item::query()
    ->whereDate('created_at', '=<', Carbon::today()->addMonthNoOverflow())
    ->get();

Carbonを多用した講座をリリースしました

日付・時間の判定・計算のためにCarbonを多用したLaravel講座を作りましたので、こちらも是非ご活用いただければ幸いです。

PHP/Laravel講座



関連記事一覧 (一部広告あり)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

アーカイブ

  1. STEAM教育

    熊本市東区でプログラミングのワークショップやります〜夏休み特別企画 こども向けス…
  2. オンライン教材

    【PHP/Laravel】初心者向けの動画をリリースしました【Udemy】
  3. オンライン教材

    【JavaScript】初心者向けの動画をリリースしました【Udemy】
  4. オンライン教材

    【AWS】【初心者向け】インフラの基礎からわかる講座をリリースしました【Udem…
  5. オンライン教材

    Udemyクーポン一覧 【2022/8/27更新】
PAGE TOP