PHPでの日付の扱いをまとめてみた

phpで日付や時間を扱うときによく使うものをまとめ書き
パラメータ、返り値の説明は、リファレンスのリンクから確認して下さい。

# タイムゾーンの設定
`date_default_timezone_set('Asia/Tokyo');`

## 関数・クラスのリスト

## time() / microtime()
現在のUnix タイムスタンプを、秒単位 / マイクロ秒単位で取得します。
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.time.php
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.microtime.php

```php
var_dump(time());			// int(1455605830)
var_dump(microtime(true));	// float(1455605830.3951)
var_dump(microtime(false));	// string(21) "0.39511400 1455605830"
```

## date()
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.date.php

```php
var_dump(date('Y/m/d H:i:s', 0));			// string(19) "1970/01/01 09:00:00"
var_dump(date('Y月n日j G時i分s秒', 0));	// string(22) "1970月1日1 9時00分00秒"
$week_str = ['日', '月', '火', '水', '木', '金', '土'];
var_dump(date('w', 0));						// string(1) "4"
var_dump($week_str[date('w', 0)]);			// string(2) "木"
```

## strtotime()
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.strtotime.php

```php
var_dump(strtotime("2010-9-10"));							// int(1455607117)　日付指定
var_dump(strtotime("2010-9-10 00:00:11"));					// int(1284044400)　日付指定
var_dump(strtotime("10 September 2010"));					// int(1284044411)　日付指定
var_dump(strtotime('now'));									// int(1284044400)　今
var_dump(strtotime("+1 day"));								// int(1455693517)　１日後
var_dump(strtotime("+1 week"));								// int(1456211917)　１週間後
var_dump(strtotime("+1 week 2 days 4 hours 2 seconds"));	// int(1456399119)　１週間と２日と４時間と２秒後
var_dump(strtotime("next Thursday"));						// int(1455721200)　次の木曜日
var_dump(strtotime("last Monday"));							// int(1455462000)　前の月曜日
strtotime( "+2 week sunday" );									//「次の次の週」に含まれる日曜日 ※「次の次の日曜」では無いので注意
ISO 8601では月曜～日曜なので、「次の週」になった時点で日曜が過ぎる。
次の次の日曜だとこう。うるう秒があったら知らない。
strtotime( "next sunday") + 7*24*60*60;
```

## DateTimeクラス
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/book.datetime.php
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/class.datetime.php

```php
$date = new DateTime();							// now
$date = new DateTime('2000-01-01');				// 日付のみ指定
$date = new DateTime('2000-01-01 13:10:00');	// 日付&時間を指定
$date->format('Y/m/d H:i:s');	// フォーマットを指定
$date->getTimestamp();			// UNIXタイムスタンプで取得
```

# 日付の比較
```php
// case 1
$today  = new DateTime('2014-10-12');
$target = new DateTime('2014-10-2');
var_dump($today == $target); // bool(false)
var_dump($today > $target); // bool(true)
var_dump($today < $target); // bool(false)

// case 2
$today  = new DateTime('2014-10-12');
$target = new DateTime('2014-10-12');
var_dump($today == $target); // bool(true)
var_dump($today > $target); // bool(false)
var_dump($today < $target); // bool(false)

// case 3
$today  = new DateTime('2014-10-12 00:00:00');
$target = new DateTime('2014-10-12 00:00:11');
var_dump($today == $target); // bool(false)
var_dump($today > $target); // bool(false)
var_dump($today < $target); // bool(true)
```

# 経過時間の比較
```php
$today  = new DateTime('2014-10-12');
$target = new DateTime('2014-10-2');

$date_diff = $today->diff($target);
echo $date_diff->format('%r%a');    // 経過総日数 10
```
<i class="fa fa-leanpub"></i> [DateTime::diff](http://php.net/manual/ja/datetime.diff.php)

# 日付と時刻の書式
> date() が理解できる書式指定文字列
> <i class="fa fa-comment-o"></i> 主にdate(), DateTime::format() などに渡すフォーマット
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.date.php
>
> サポートする日付と時刻の書式
> <i class="fa fa-comment-o"></i> 主にstrtotime(), new DateTime() に渡すフォーマット
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/datetime.formats.php
>
> `DateTime::diff`の返り値のクラス(`DateInterval`)の`format()`メソッドに渡すフォーマット
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/dateinterval.format.php

# オマケ sleep() / usleep() / time_nanosleep()
直接関係無いけど、スリープ系
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.sleep.php
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.usleep.php
> <i class="fa fa-leanpub"></i> http://php.net/manual/ja/function.time-nanosleep.php