Laravel UUID/ULID からタイムスタンプを取得する機能を試してみる
前置き
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 インスタンスを取得できます。ここで、私の気付いた注意点を記載しておきたいと思います。
- 例外処理は自分で行う。
- Laravel 標準の UUID v4 は、タイムスタンプは取得できない。
- 必要に応じて、タイムゾーンの設定も必要。
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