4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

タイムスタンプをミリ秒単位でISO8601表記に変換する

Last updated at Posted at 2020-07-13

意外と手こずったので忘備録がわりに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です

参照:https://github.com/briannesbitt/Carbon/blob/9a6737a39deb3cbf2531e1b5f3aa4714a5212b23/src/Carbon/CarbonInterface.php#L2162-L2169

PHPに対する愚痴

そもそもISO8601形式のフォーマットってDateTime::ISO8601でなくDateTime::ATOMで定義されてるってどういう経緯なんですかね?便利どころかすごく紛らわしいと思うんですけど、なぜこういう仕様なのか?不思議です。で、PHP7系からミリ秒対応されたと聞いたんですが、DateTime::ATOMはミリ秒ないし、ミリ秒のあるフォーマットは追加されてなさそうだし、なんか不親切に感じます。\DateTime::RFC3339_EXTENDEDがありました!PHP7.0.0系以降追加されてました。

軽微だしCarbonにあとでpull requestでも投げてみるかな…

参考

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?