PHPの「DateTime::ISO8601」に嵌められた

Ω ΩΩ< な、なんだってー!!
WordPressにAPI経由で予約投稿を行おうと思って、日付を設定してみたんですけど、何度やってみても怒られる。



GuzzleHttp\Exception\ClientException  : Client error: `POST https://beta.1ni.co/wp-json/wp/v2/posts` resulted in a `400 Bad Request` response:
{"code":"rest_invalid_param","message":"\u7121\u52b9\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc: date","data":{"status":4 (truncated...)


どうやら「date」の形式が間違ってると言われているみたい。

WordPressのREST APIの仕様を確認すると、


date
string, datetime (ISO8601)
The date the object was published, in the site’s timezone.


と書いてあるのでそれに沿って書き出そうと思って、

$date = Carbon::tomorrow();
$date->hour = 21;
$date->dormat(DateIme::ISO8601)

といった感じにしてたんだけど……これが間違い。
詳しくはこちらに書いてあるけれど、


PHPのDateTime::ISO8601はISO8601ではない – Qiita


DateTime::ISO8601 で出力される文字列はISO8601に準拠してない。

ISO8601に準拠するためには次のどちらかでないといけないのに、


  • 20190711T210000+0900
  • 2019-07-11T21:00:00+09:00


DateTime::ISO8601で出力される文字列はこうなってる。


  • 2019-07-11T21:00:00+0900


後ろの「+0900」の部分にコロンが足りない。


おいマジかよふざけんな。なんでこんなことになってんの?



DateTime::ATOMかDateTime::W3Cを使いましょう(使うなら)


ドキュメントを見る限り、「DateTime::ATOM」か「DateTime::W3C」なら期待通りの文字列を出力してくれます。まああとで見てなんでW3C?とかなる可能性もあるので、自分で形式を指定して出力した方が良いかもしれませんけどね。


PHP: DateTime – Manual


今まで全然気付いてなかったわー。嵌められた。