PHPで日時(ISO8601)の文字列をDateTimeに変換する、したい。
開発していてたまによくあるすんなりいかないパターンのやつがあったので備忘です。どなたかのお役に立てたら幸いです。
どういうケース?
SalesforceのAPIから返ってくるDateTimeをPHPでパースしようとして詰まったのがこのケースです。Salesforceの画面上は日本時間で見えている場合でもUTCで返ってきていました。しかもマイクロ秒付きで。
レッツトライ
ISO8601にDateTime::ISO8601は使えない
まずは失敗例からです。以下のようにDateTime::createFromFormatでDateTime::ISO8601を指定するとbool(false)になります。残念。
ドキュメントを見てみると記載があるのですがDateTime::ISO8601は使えないんですね。うーん。
注意: この書式は ISO-8601 との互換性がありませんが、敢えてそのまま残しています。 下位互換性を保つためです。ISO-8601 互換の書式を使いたい場合は、
https://www.php.net/manual/ja/class.datetime.phpDateTime::ATOM
あるいはDATE_ATOM
を使いましょう。
書式を自分であわせるしかなさそう
ATOMを使いましょうと書いてあるものの今回はマイクロ秒まであるせいか結果は変わらず失敗でした。なので、パースできる書式をあてるしかないようですね。以下のドキュメントのフォーマット文字を参照すると..。ポイントは+で秒以降を切り捨ててることくらいでしょうか。
https://www.php.net/manual/ja/datetime.createfromformat.php
無事、DateTimeになりましたね!ホッ
これだとまだUTCのままなので、日本にタイムゾーン変えればOK。
DateTime::createFromFormatで第3引数にタイムゾーンを渡せますが、そこにAsia/Tokyoをわたしてしまうと、この例でいうと9時が日本時間になるので、UTCでDateTime::createFromFormatしたあとにタイムゾーンをセットすればうまくいきます。
時よ止まれ
この記事にコード埋め込むために初めてGist(GitHub)つかいました。みやすいし、すぐ使えるし、いいですね。
今回みたいなので引っかかって時間つかっちゃう僕はまだまだ3流エンジニア…。
コメント