⏱️

Laravel UUID/ULID からタイムスタンプを取得する機能を試してみる

2023/05/26に公開

前置き

Laravel Ver. 10.11 にて、UUID/ULID からタイムスタンプ(Carbon インスタンス)を取得する新機能が加わったので、それを試した時の記録です。(微妙な注意点も交えつつ)

参考リンク:
Github: Adds timestamp retrieval as Carbon instance from UUID/ULID #47046
日本語ドキュメント

新機能とは書きましたが、今回追加になったメソッド Carbon::createFromId() の実質の処理は3行程で、別にこれに頼らなくてもできるじゃん、という噂もありますが、その辺は一旦忘れたいと思います。

ちなみに、UUID/ULID については、以前記事に書きましたので、そちらも参考にして下さい。

本題

という事で、この新機能を使うと UUID/ULID の文字列からタイムスタンプ情報を取得できます。とは言え、UUID の場合は、v1, v2, v6, v7 では対応しているものの Laravel 標準の v4 では対応していません(タイムスタンプ取得できません)。(詳しくは下で)

基本的な使い方は、ドキュメントにもある通り、Carbon::createFromId() に UUID 又は ULID の文字列を渡すのみです。(続きあり)

use Illuminate\Support\Carbon;
use Illuminate\Support\Str;

$date = Carbon::createFromId((string) Str::ulid());

これで、Carbon インスタンスを取得できます。ここで、私の気付いた注意点を記載しておきたいと思います。

  1. 例外処理は自分で行う。
  2. Laravel 標準の UUID v4 は、タイムスタンプは取得できない。
  3. 必要に応じて、タイムゾーンの設定も必要。

1. 例外処理は自分で行う。

必要に応じて、例外処理は自分で行う必要があります。

プルリクの @DarkGhostHunter 氏の最初のコメントのみを見るとそう見えないかも知れませんが、不正 or 非対応な文字列を渡すと例外が発生するので、適宜自分で処理を行う必要があります。プルリクの最初の文章は、あくまでプルリク提出時の話で、最後は、Taylor 氏によって変更されている為。(という事で、Laravel News の記事は、間違っているので見ない方がいいです)

2. Laravel 標準の UUID v4 は、タイムスタンプは取得できない。

そのままですが、下記の通りとなります。

$id = (string) Str::uuid(); // Laravel 標準 v4

try {
    $date = Carbon::createFromId($id);
} catch (\Throwable $th) {
    dd('対応していません'); // ← ★ ここに来る
}

3. 必要に応じて、タイムゾーンの設定が必要。

取得したタイムスタンプは、適宜タイムゾーンを設定した上で使用する必要があります。

use Ramsey\Uuid\Uuid;

$id = Uuid::uuid7(); // v7

$date = Carbon::createFromId($id);
$date->setTimezone('Asia/Tokyo'); // ← これ!

dd($date->format('Y-m-d H:i:s'));

config/app.php'timezone' => 'Asia/Tokyo', と設定していても上記が必要です。

以上です。

なお、注意点には含めていませんが、Carbon の名前空間のインポートは、Laravel が独自で拡張している Illuminate\Support\Carbon の方であって、直接本体の Carbon\Carbon を指定してはダメですね。

雑感

試してはみたものの、今の所使う予定は無し…😅

間違い等ありましたらコメントお願いします。

Discussion