忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP Carbon 日付ライブラリの使い方について(Carbon\Carbon)


今回はPHPで使われる日付ライブラリの Carbon の使い方について説明したいと思います。
なお Carbon のインストールについては以下の記事を参照して下さい。

PHP Carbon(ライブラリ)を使って日付処理・インストール

以下の順で説明したいと思います。




■Carbon インスタンスの生成

先ずは Carbon クラスのインスタンスの生成について例をあげて説明します。

普通に new Carbon() とすることで Carbon のインスタンスを生成できます。 生成されたインスタンスを指し示す変数から各種のメソッドを使うことで各種の処理ができます。

また Carbon 備わった各種のスタティックなメソッドでもインスタンスの生成ができます。 以下の例では now() yesterday() tomorrow() などを示しています。

new Carbon('日付指定文字列') のクラスの引数に日付指定文字列を渡すことで指定した日付のインスタンスを生成できます。

<?php
// ライブラリ読込
require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php';
// ライブラリ使用宣言
use Carbon\Carbon;

// インスタンス生成:現在のシステム日時
$dtCar = new Carbon();
echo "現在のシステム日時: ".$dtCar."<br>\n"; // 文字列を返すデフォルトのメソッドは「__toString()」
echo "現在のシステム日時: ".$dtCar->__toString()."<br>\n";

// static な関数による生成
// インスタンス生成(static):本日
$dtNow = Carbon::now();
echo "static-本日: ".$dtNow."<br>\n";

// インスタンス生成(static):昨日
$dtYes = Carbon::yesterday();
echo "static-昨日: ".$dtYes."<br>\n";

// インスタンス生成(static):明日
$dtTom = Carbon::tomorrow();
echo "static-明日: ".$dtTom."<br>\n";

// Carbonクラス生成時にパースを渡す
// クラス生成時に日付文字列を渡す
$dt1 = new Carbon('2022-11-30');
echo "日付文字列を渡す: ".$dt1."<br>\n";

// クラス生成時に日付加算文字列を渡す(システム日付[2022-11-29]に対して次の日)
$dt2 = new Carbon('+1 days');
echo "日付加算文字列を渡す: ".$dt2."<br>\n";

// クラス生成時に月数加算文字列を渡す(システム日付[2022-11-29]に対して2か月後)
$dt3 = new Carbon('+2 months');
echo "月数加算文字列を渡す: ".$dt3."<br>\n";

// クラス生成時に年数加算文字列を渡す(システム日付[2022-11-29]に対して2年後)
$dt4 = new Carbon('+2 years');
echo "年数加算文字列を渡す: ".$dt4."<br>\n";

// クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して次月の初日)
$dt5 = new Carbon('first day of next month');
echo "次月の最初の日: ".$dt5."<br>\n";

// クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して前月の初日)
$dt6 = new Carbon('first day of last month');
echo "前月の最初の日: ".$dt6."<br>\n";

// クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して次月の末日)
$dt7 = new Carbon('last day of next month');
echo "次月の最後の日: ".$dt7."<br>\n";

// クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して前月の末日)
$dt8 = new Carbon('last day of last month');
echo "前月の最後の日: ".$dt8."<br>\n";

// クラス生成時に日付指定の生成メソッドを使用
$dt9 = Carbon::createFromDate(2022, 9, 25);
echo "日付指定の生成メソッド: ".$dt9."<br>\n";

// クラス生成時に日時指定の生成メソッドを使用
$dt10 = Carbon::create(2022, 9, 25, 17, 10, 36, 'Asia/Tokyo'); // タイムゾーン指定は無くてもOK
echo "日時指定の生成メソッド: ".$dt10."<br>\n";
?>

このプログラムの実行結果は以下の通りです。

現在のシステム日時: 2022-11-29 08:48:39
現在のシステム日時: 2022-11-29 08:48:39
static-本日: 2022-11-29 08:48:39
static-昨日: 2022-11-28 00:00:00
static-明日: 2022-11-30 00:00:00
日付文字列を渡す: 2022-11-30 00:00:00
日付加算文字列を渡す: 2022-11-30 08:48:39
月数加算文字列を渡す: 2023-01-29 08:48:39
年数加算文字列を渡す: 2024-11-29 08:48:39
次月の最初の日: 2022-12-01 08:48:39
前月の最初の日: 2022-10-01 08:48:39
次月の最後の日: 2022-12-31 08:48:39
前月の最後の日: 2022-10-31 08:48:39
日付指定の生成メソッド: 2022-09-25 08:48:39
日付指定の生成メソッド: 2022-09-25 17:10:36



■日付データの取得(Getter)

Carbon クラスのインスタンスの生成しその日付データから各種の日付に関するデータを取得できます。
日付データのなかで良く使われるであろうものをピックアップしました。

取得の名前をみると VB.NETDateTime 型のプロパティとよく似ていると思いますが、真似をしたのでしょうか?
とにかく、実際に例を以下に示します。

<?php
// ライブラリ読込
require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php';
// ライブラリ使用宣言
use Carbon\Carbon;

// クラス生成時に日付文字列を渡す
$dt = new Carbon('2022-11-30 12:25:30.123456');
echo "<pre>";
echo "日付:".$dt->format('Y/m/d H:i:s.u')."\n";

// 各種 getter(戻り値はInteger)
// 年
echo '$dt->year       :';var_dump($dt->year);
// 月
echo '$dt->month      :';var_dump($dt->month);
// 日
echo '$dt->day        :';var_dump($dt->day);
// 時
echo '$dt->hour       :';var_dump($dt->hour);
// 分
echo '$dt->minute     :';var_dump($dt->minute);
// 秒
echo '$dt->second     :';var_dump($dt->second);
// マイクロ秒
echo '$dt->micro      :';var_dump($dt->micro);
// 週のIndex値 (日:0, 月:1, 火:2, 水:3, 木:4, 金:5, 土:6)
echo '$dt->dayOfWeek  :';var_dump($dt->dayOfWeek);
// 年の何日目(0から始まる)
echo '$dt->dayOfYear  :';var_dump($dt->dayOfYear);
// 月の何週目(1から始まる)
echo '$dt->weekOfMonth:';var_dump($dt->weekOfMonth);
// 年の何週目(1から始まる)
echo '$dt->weekOfYear :';var_dump($dt->weekOfYear);
// 月の日数
echo '$dt->daysInMonth:';var_dump($dt->daysInMonth);
// 第何四半期か
echo '$dt->quarter    :';var_dump($dt->quarter);
echo "</pre>";
?>

このプログラムの実行結果は以下の通りです。これらの値は全て Integer 型で返されます。

日付:2022/11/30 12:25:30.123456
$dt->year       :int(2022)
$dt->month      :int(11)
$dt->day        :int(30)
$dt->hour       :int(12)
$dt->minute     :int(25)
$dt->second     :int(30)
$dt->micro      :int(123456)
$dt->dayOfWeek  :int(3)
$dt->dayOfYear  :int(334)
$dt->weekOfMonth:int(5)
$dt->weekOfYear :int(48)
$dt->daysInMonth:int(30)
$dt->quarter    :int(4)



■日付データの設定(Setter)

上記の「日付データの取得(Getter)」では各種の日付データの取得を行いましたが、 ここではその Getter の名前に値を設定することで日付データインスタンス内の値を変更することが出来ます。

<?php
// ライブラリ読込
require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php';
// ライブラリ使用宣言
use Carbon\Carbon;

// 取敢えずクラス生成
$dt = new Carbon();
// 各種 setter
// 年
$dt->year       = 2022;
// 月
$dt->month      = 12;
// 日
$dt->day        = 1;
// 時
$dt->hour       = 13;
// 分
$dt->minute     = 45;
// 秒
$dt->second     = 29;
// マイクロ秒
$dt->micro      = 987654;

// 日付表示
echo "日付:".$dt->format('Y/m/d H:i:s.u')."\n";
?>

このプログラムの実行結果は以下の通りです。

日付:2022/12/01 13:45:29.987654



■日付データの加減算

上記の「日付データの取得(Getter)」の名前に「add」及び「sub」では各種の日付データの取得を行いましたが、 ここではその Getter の名前に値を設定することで日付データインスタンス内の値を変更することが出来ます。

以下に加減算を行うメソッドの主なものを示します。 取敢えず実行結果は長くなるので、コメントとして右側に表示しています。

<?php
// ライブラリ読込
require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php';
// ライブラリ使用宣言
use Carbon\Carbon;

// クラス生成時に日付文字列を渡す
$dt = new Carbon('2022-11-30 12:25:30.123456');
echo "<pre>";
echo "日付:".$dt->format('Y/m/d H:i:s.u')."\n";

// 各種 加減算
// 世紀
echo '世紀'."\n";                                      // 取敢えず結果をコメントで表示
echo $dt->addCenturies(4)."\n";   //指定世紀数分加算   // 2422-11-30 12:25:30
echo $dt->addCentury()."\n";      //1世紀加算         // 2522-11-30 12:25:30
echo $dt->subCentury()."\n";      //1世紀減算         // 2422-11-30 12:25:30
echo $dt->subCenturies(4)."\n";   //指定世紀数分減算   // 2022-11-30 12:25:30
// 年
echo '年'."\n";
echo $dt->addYears(2)."\n";       //指定年数分加算     // 2024-11-30 12:25:30
echo $dt->addYear()."\n";         //1年加算           // 2025-11-30 12:25:30
echo $dt->subYear()."\n";         //1年減算           // 2024-11-30 12:25:30
echo $dt->subYears(2)."\n";       //指定年数分減算     // 2022-11-30 12:25:30
// 月
echo '月'."\n";
echo $dt->addMonths(60)."\n";     //指定月数分加算     // 2027-11-30 12:25:30
echo $dt->addMonth()."\n";        //1月加算           // 2027-12-30 12:25:30
echo $dt->subMonth()."\n";        //1月減算           // 2027-11-30 12:25:30
echo $dt->subMonths(60)."\n";     //指定月数分減算     // 2022-11-30 12:25:30
// 日
echo '日'."\n";
echo $dt->addDays(29)."\n";       //指定日数分加算     // 2022-12-29 12:25:30
echo $dt->addDay()."\n";          //1日加算           // 2022-12-30 12:25:30
echo $dt->subDay()."\n";          //1日減算           // 2022-12-29 12:25:30
echo $dt->subDays(29)."\n";       //指定日数分減算     // 2022-11-30 12:25:30
// 週
echo '週'."\n";
echo $dt->addWeeks(3)."\n";       //指定週分加算       // 2022-12-21 12:25:30
echo $dt->addWeek()."\n";         //1週加算           // 2022-12-28 12:25:30
echo $dt->subWeek()."\n";         //1週減算           // 2022-12-21 12:25:30
echo $dt->subWeeks(3)."\n";       //指定週分減算       // 2022-11-30 12:25:30
// 週(土日以外)
echo '週'."\n";
echo $dt->addWeekdays(4)."\n";    //指定週分加算       // 2022-12-06 12:25:30
echo $dt->addWeekday()."\n";      //1世紀加算         // 2022-12-07 12:25:30
echo $dt->subWeekday()."\n";      //1世紀減算         // 2022-12-06 12:25:30
echo $dt->subWeekdays(4)."\n";    //指定週分減算       // 2022-11-30 12:25:30
// 時
echo '時'."\n";
echo $dt->addHours(24)."\n";      //指定時間分加算     // 2022-12-01 12:25:30
echo $dt->addHour()."\n";         //1時間加算         // 2022-12-01 13:25:30
echo $dt->subHour()."\n";         //1時間減算         // 2022-12-01 12:25:30
echo $dt->subHours(24)."\n";      //指定時間分減算     // 2022-11-30 12:25:30
// 分
echo '分'."\n";
echo $dt->addMinutes(61)."\n";    //指定分数加算       // 2022-11-30 13:26:30
echo $dt->addMinute()."\n";       //1分加算           // 2022-11-30 13:27:30
echo $dt->subMinute()."\n";       //1分減算           // 2022-11-30 13:26:30
echo $dt->subMinutes(61)."\n";    //指定分数減算       // 2022-11-30 12:25:30
// 秒
echo '秒'."\n";
echo $dt->addSeconds(61)."\n";    //指定秒数加算       // 2022-11-30 12:26:31
echo $dt->addSecond()."\n";       //1秒加算           // 2022-11-30 12:26:32
echo $dt->subSecond()."\n";       //1秒減算           // 2022-11-30 12:26:31
echo $dt->subSeconds(61)."\n";    //指定秒数減算       // 2022-11-30 12:25:30
echo "</pre>";
?>

■日付データの比較

日付データの比較は「等しい」「大きい」「小さい」などの英語表記の以下のメソッドがあります。


以下に比較を行うメソッドの主なものを示します。 取敢えず実行結果は長くなるので、コメントとして右側に表示しています。

<?php
// ライブラリ読込
require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php';
// ライブラリ使用宣言
use Carbon\Carbon;

// クラス生成時に日付文字列を渡す
// 日付の設定
$first  = Carbon::create("2022-10-05");
$second = Carbon::create("2022-10-06");

echo "<pre>";
// $second から見て $first がどうかを比較
// equal
var_dump($first->eq($second));                     // bool(false)
// not equal
var_dump($first->ne($second));                     // bool(true)
// greater than
var_dump($first->gt($second));                     // bool(false)
// greater than or equal
var_dump($first->gte($second));                    // bool(false)
// less than
var_dump($first->lt($second));                     // bool(true)
// less than or equal
var_dump($first->lte($second));                    // bool(true)
echo "</pre>";
?>



■日付データのデータ変換

Carbon には日付データから ArrayObject(stdclass)DateTimeクラス、DateTimeImmutableクラスへの変換用メソッドがあります。 これらのメソッドが有用かどうかは別として、取り敢えず紹介しておきます。

<?php
// ライブラリ読込
require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php';
// ライブラリ使用宣言
use Carbon\Carbon;

// クラス生成
$dt = Carbon::createFromFormat('Y-m-d H:i:s.u', '2022-12-05 16:45:27.612984');

echo "<pre>";
// Array への変換
$arrDt = $dt->toArray();
var_dump($arrDt);

// Object への変換(stdclass)
$objDt = $dt->toObject();
var_dump($objDt);

// DateTime への変換
$dateDt = $dt->toDate(); // Same as $dt->toDateTime()
var_dump($dateDt);

// DateTimeImmutable への変換
$objDtim = $dt->toDateTimeImmutable();
var_dump($objDtim);
echo "</pre>";
?>

このプログラムの実行結果は以下の通りです。

array(12) {
  ["year"]=>
  int(2022)
  ["month"]=>
  int(12)
  ["day"]=>
  int(5)
  ["dayOfWeek"]=>
  int(1)
  ["dayOfYear"]=>
  int(339)
  ["hour"]=>
  int(16)
  ["minute"]=>
  int(45)
  ["second"]=>
  int(27)
  ["micro"]=>
  int(612984)
  ["timestamp"]=>
  int(1670258727)
  ["formatted"]=>
  string(19) "2022-12-05 16:45:27"
  ["timezone"]=>
  object(Carbon\CarbonTimeZone)#4 (2) {
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(3) "UTC"
  }
}
object(stdClass)#3 (12) {
  ["year"]=>
  int(2022)
  ["month"]=>
  int(12)
  ["day"]=>
  int(5)
  ["dayOfWeek"]=>
  int(1)
  ["dayOfYear"]=>
  int(339)
  ["hour"]=>
  int(16)
  ["minute"]=>
  int(45)
  ["second"]=>
  int(27)
  ["micro"]=>
  int(612984)
  ["timestamp"]=>
  int(1670258727)
  ["formatted"]=>
  string(19) "2022-12-05 16:45:27"
  ["timezone"]=>
  object(Carbon\CarbonTimeZone)#5 (2) {
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(3) "UTC"
  }
}
object(DateTime)#6 (3) {
  ["date"]=>
  string(26) "2022-12-05 16:45:27.612984"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(DateTimeImmutable)#8 (3) {
  ["date"]=>
  string(26) "2022-12-05 16:45:27.612984"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}











PR

コメント

コメントを書く