【PHP】w3cdtf形式の日付フォーマット変換

Laravel

w3cdtf形式で受信した日付データのフォーマット変換

w3cdtfとは

ISO8601の日付形式のプロファイル。インターネットで時刻情報をやり取りするときに使用する。

  • YYYY(2018)
  • YYYY-MM(2018-11)
  • YYYY-MM-DD(2018-11-20)
  • YYYY-MM-DDThh:mmTZD(2018-11-20T10:45+09:00)
  • YYYY-MM-DDThh:mm:ssTZD(2018-11-20T10:45:23+09:00)
  • YYYY-MM-DDThh:mm:ss.sTZD(2018-11-20T10:45:23.5+09:00)

+09:00はUTC(協定世界時=グリニッジ標準時)との時差を表しています。+0900と表記することも可能。

w3cdtf形式のフォーマット変換

GETまたはPOSTパラメータとして受け取ったw3cdtf形式をPHPで使い勝手よくするためのフォーマット変換で少しハマったのでメモ。

w3cdtfのフォーマット変換そのものはdate関数とstrtotime関数の組み合わせで実装可能。

$w3cDate = "2018-11-20T01:23:45+09:00";
$date = date("Y-m-d H:i:s", strtotime($w3cDate));

しかしこの$w3cDateを実際にGETデータに置き換えると上手く動かない。

var_dump($date);
 =>string(19) "1970-01-01 09:00:00"

なぜか日付が1970年(UNIXシステムでの時間の起点)に。

そこでパラメータの値を確認してみることに

$parameter = $request->input();
var_dump($parameter["date"]);
 =>string(25) "2018-11-20T12:34:56 09:00"

どうやら+09:00の+が消えてしまった模様。GETやPOSTで+を送信すると消えてしまう。

つまり送信元の方で

$data = urlencode($data);

とURLエンコードしてあげて解決。

コメント