バックエンド

『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. 生成AI

    2024/5/14 OpenAI発表 まとめ
  2. オンライン教材

    ChatGPTをビジネス活用する講座をリリースしました【Udemy】
  3. オンライン教材

    【React】初心者向け講座をリリースしました【MUI】【Udemy】
  4. データベース

    MySQLの講座をリリースしました
  5. オンライン教材

    【ChatGPT】エンジニア編をリリースしました
PAGE TOP
Ads Blocker Image Powered by Code Help Pro

広告ブロックを摘出しました!!

ブラウザ拡張を使用して広告をブロックしていることが摘出されました。

ブラウザの広告ブロッカーの機能を無効にするか、
当サイトのドメインをホワイトリストに追加し、「更新」をクリックして下さい。

あなたが広告をブロックする権利があるように、
当方も広告をブロックしている人にコンテンツを提供しない権利と自由があります。

Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock