意外と手こずったので忘備録がわりにQiitaに残します。PHPで日時計算するには、Carbonが定石なので、Carbonを入れていることを前提とします。
2020.7.28 コメントいただいたので修正しました!
やり方
タイムスタンプを秒単位でISO8601形式にするためにCarbon::toIso8601String()
が準備されていますが、秒単位で固定のメソッドです。似たようなメソッドでUTC固定のCarbon::toIso8601ZuluString($unitPresion='second')
は引数を与えることによってミリ秒単位で変換できますが。なので下記のような記述になります。
<?php
use Carbon\Carbon;
require 'vendor/autoload.php';
// ISO8601 形式
$iso8601 = Carbon::createFromTimestampMs($timestamp, 'Asia/Tokyo')->toIso8601String();
// ISO8601 形式(ミリ秒)
$iso8601m = Carbon::createFromTimestampMs($timestamp, 'Asia/Tokyo')
->rawFormat(\DateTime::RFC3339_EXTENDED);
echo $timestamp;
echo $iso8601;
echo $iso8601m;
結果
1594618689760
2020-07-13T14:38:09+09:00
2020-07-13T14:38:09.760+09:00
全然スマートな方法じゃないんですけど、多分一番罠を踏み抜かないやり方かなあと思います。
Carbon::getTimeFormatByPrecision
の引数は
"minute""second""millisecond""microsecond"
が渡せるようです。デフォルト値はsecond
です
PHPに対する愚痴
そもそもISO8601形式のフォーマットってDateTime::ISO8601
でなくDateTime::ATOM
で定義されてるってどういう経緯なんですかね?便利どころかすごく紛らわしいと思うんですけど、なぜこういう仕様なのか?不思議です。で、PHP7系からミリ秒対応されたと聞いたんですが、DateTime::ATOM
はミリ秒ないし、ミリ秒のあるフォーマットは追加されてなさそうだし、なんか不親切に感じます。\DateTime::RFC3339_EXTENDEDがありました!PHP7.0.0系以降追加されてました。
軽微だしCarbonにあとでpull requestでも投げてみるかな…