【php】日付操作ライブラリCarbonを使ってみよう


[第34回関西PHP勉強会](https://kphpug.doorkeeper.jp/events/45920 "第34回関西PHP勉強会")で登壇した内容です。
[テクテク関西というブログ](http://tec-kansai.tech/ "テクテク関西というブログ")には資料も上げてますのでよければ。

#Carbon

- PHPのDateTimeクラスを継承して拡張された日時操作ライブラリ
- 英語圏の時刻表記とかもしてくれる（8/10/2016みたいに日本とは順番が違うのでちょっと面倒）
- Laravelには標準搭載
- 直接ダウンロードかComposerでインストール可能

#インストール

今回はcomposerを使ってインストール。
まずはサンプルとして新規作成したディレクトリ`carbonTest`内に移動して、

```
$ composer require nesbot/carbon
```

するとディレクトリ内に

- composer.json
- composer.lock
- vendor

ができました。
ディレクトリ構成はこんな感じ。

```
carbonTest/
　├ public
　│	 └ index.php
　│
　├ composer.json
　├ composer.lock
　└ vendor/
　	 ├ composer
　	 ├ symfony
　	 └ nesbot
　	 	 └ carbon
```

自分でつくったpublic/index.phpに実際のコードを書いていきます。

#準備

- `require` でautoload.phpを読み込み
- use宣言で `Carbon` 

を忘れずに。

```php:index.php
<?php
require __DIR__ . "/../vendor/autoload.php";

use Carbon\Carbon;
```

#使ってみる【超基本】

##現在時刻の表示

```index.php
echo Carbon::now(); // 2016-06-16 09:52:03
```

タイムゾーンを指定するときは

```index.php
echo Carbon::now('Asia/Tokyo');
```

##日付のみ表示

```index.php
echo Carbon::now()->toDateString(); // 2016-06-16
```

##フォーマットを変える

```index.php
echo Carbon::now()->format(‘今日はY年m月d日だよ！’); // 今日は2016年06月16日だよ！
```

##日付を作る

```index.php
echo Carbon::create(2000, 12, 12, 10, 20, 30); // 2000-12-12 10:20:30
```

#使ってみる【ちょっと実用的】

実際は「今」以外も必要になることはザラにあるので、変数にすると便利です。

```php:index.php
$today = Carbon::now();
echo $today; // 2016-06-16 09:52:03

$dt = Carbon::create(2000, 12, 12, 10, 20, 30);
echo $dt; // 2000-12-12 10:20:30
```

##足し算（引き算）

- 引き算は `add` を `sub` に変える
- 複数足したい場合は `addDays(5)` のようにする（間違って`addDay(5)`でも大丈夫です）

```php:index.php
$dt = Carbon::create(2000, 12, 12, 10, 20, 30);

echo $dt->addDay();　　　	//2000-12-13 10:20:30
echo $dt->addWeek();　　 	//2000-12-20 10:20:30
echo $dt->addMonth();　　	//2000-01-20 10:20:30
echo $dt->addYear();　　 	//2001-01-20 10:20:30
echo $dt->addHour();　　 	//2001-01-20 11:20:30
echo $dt->addMinute();  	//2001-01-20 11:21:30
echo $dt->addSecond();  	//2001-01-20 11:21:31
```

###注意点

上の例を見ればわかるように、`$dt` に足していくとどんどん上書きされていくので
状況に応じて下のようにコピーすることも忘れずに。

```php:index.php
$dt = Carbon::create(2000, 12, 12, 10, 20, 30);

echo $dt->copy()->addDay();　　　	//2000-12-13 10:20:30
echo $dt->copy()->addWeek();　　 	//2000-12-19 10:20:30
echo $dt->copy()->addMonth();　　	//2000-01-12 10:20:30
echo $dt->copy()->addYear();　　 	//2001-12-12 10:20:30
echo $dt->copy()->addHour();　　 	//2001-12-12 11:20:30
echo $dt->copy()->addMinute();  	//2001-12-12 11:21:30
echo $dt->copy()->addSecond();  	//2001-12-12 11:21:31
```

#使ってみる【日付検索とかに使えそうなやつ】

##$dt1は$dt2・・・（２つの日付で比較）

```php:index.php
$dt1 = Carbon::create(2000, 8, 12);
$dt2 = Carbon::create(2000, 12, 12);

「といっしょ」　var_dump($dt1->eq($dt2));　// false

「より大きい」　var_dump($dt1->gt($dt2));　// false
「以上」　　　　var_dump($dt1->gte($dt2)); // false

「より小さい」　var_dump($dt1->lt($dt2));　// true
「以下」　　　　var_dump($dt1->lte($dt2)); // true
```

##$dt3は$dt1と$dt2の間にある？

```php:index,php
$dt1 = Carbon::create(2000, 8, 12);
$dt2 = Carbon::create(2000, 12, 12);
$dt3 = Carbon::create(2000, 10, 12);

var_dump($dt3->between($dt1, $dt2)); // true
```

#使ってみる【既存の日付をこねこねする】

##Carbon::createFromFormatで書式を変える。

書式を変える[DateTime](http://php.net/manual/ja/class.datetime.php "DateTime")を使う。
第一引数にフォーマット、第二引数に書式を変えたいやつを入れる。

```php:index.php
// $event["started_at"]は「2016-01-01T20:00:00+09:00~」とする
Carbon::createFromFormat(DateTime::ATOM,$event["started_at"])
```

#使ってみる【曜日を日本語で出力】

```php:index.php
setlocale(LC_ALL, 'ja_JP.UTF-8');
Carbon::createFromFormat(DateTime::ATOM,$event["started_at"])->formatLocalized('%m/%d(%a)');
```

#参考

- [公式サイト](http://carbon.nesbot.com/ "公式サイト")
- [アシアルさんのブログ](http://blog.asial.co.jp/1392 "アシアルさんのブログ")
- [Apelog](https://apecell.com/2016/02/08/id/219 "Apelog")
- [omoonさんのブログ](http://blog.omoon.org/20160309/1075 "omoonさんのブログ")