PHPで文字列から日付オブジェクトへ変換

やること: "2018-04-16 09:31:45 GMT"を"4月16日 18:31の投稿"へリフォーマット!

TumblrのAPIを使って記事をJSONの形で取得したとき,日付が次のような文字列で送られてきました.

// 例) $feed["response"]["posts"][0]["date"]の中身
"2018-04-16 09:31:45 GMT"

これを例えば次のような形にフォーマットし直したかったのです.

"4月16日 18:31の投稿"

やることとして,まず日本時間(+9時間)へ直し,それからフォーマットを行う必要がありました. 調べるとDateTimeを使った方法が良いようです.

$date = new DateTime("2018-04-16 09:31:45 GMT");
$date->setTimeZone(new DateTimeZone("Asia/Tokyo"));
echo $date->format("n月j日 H:iの投稿"); // 4月16日 18:31の投稿

まず1行目new DateTime("2018-04-16 09:31:45 GMT")と直接文字列を入れてみたところ,当たり前のように上手く行ってニッコリしてしまいました. どうやらPHPのDateTimeはいくつかの文字列フォーマットを自動で識別してDateTimeへ変換してくれるようです.

続いて2行目setTimeZone(new DateTimeZone("Asia/Tokyo"))でGMT(グリニッジ標準時)から日本時間へと変換しています. 時刻に時差の9時間がプラスされる計算です.

最後の3行目$date->format(...)でフォーマットをしています. フォーマットに使う特殊文字(nやjなど)については公式サイトのこちらを参照ください. もし,この特殊文字も文字列として表示させたい場合はバックスラッシュ(\)でエスケープしましょう.

echo $date->format("\o\\n M jS \a\t H:i");
// on April 16th at 18:31

\nに限っては改行文字として認識されたのか,なぜかnと表示されませんでした. nに限っては二重にエスケープする必要があるようです(なぜだろう…). エスケープするよりも単純に文字列を結合させた書き方のほうが読みやすいかもしれません.

echo "on" . $date->format("M jS") . " at " . $date->format(H:i);
// on April 16th at 18:31

これで上手くフォーマットできました.

7555960857471168365 https://www.storange.jp/2018/04/php.html https://www.storange.jp/2018/04/php.html PHPで文字列から日付オブジェクトへ変換 2018-04-26T15:37:00+09:00 https://www.storange.jp/2018/04/php.html Hideyuki Tabata 200 200 72 72