2
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?

UUID v7 と化した Guid からタイムスタンプを抜き出す

Posted at

やりたいこと

前回の記事で UUID v7 に準拠した Guid を使えるようになりました。

ここからタイムスタンプ部分を抜き出してみようと思います。

やり方

仕様を確認

  • 先頭 48bit がタイムスタンプ
  • UNIX 時間のミリ秒が16進数で格納されている

実装していく

UUID v7 準拠の Guid を生成

Guid guid = Guid.CreateVersion7();

先頭 48bit がタイムスタンプなので抜き出す

  • 16進数にすると12桁
  • 8-4-4-4-12 のうち 8-4 の部分
string str = guid.ToString("N")[..12];

Guid.ToString メソッドで書式指定子 N を使うとハイフン抜きの文字列が取得できます。

UNIX 時間のミリ秒から DateTimeOffset を生成

  • 16進数文字列を整数型に変換する
  • DateTimeOffset のファクトリーメソッドを使う
long milliseconds = Convert.ToInt64(str, 16);
DateTimeOffset timestamp = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);

完成

Guid guid = Guid.CreateVersion7();
string str = guid.ToString("N")[..12];
long milliseconds = Convert.ToInt64(str, 16);
DateTimeOffset timestamp = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);
ConsoleWriteLine(timestamp);
2024/12/04 11:58:49 +00:00

Guid に拡張メソッドを追加

使いやすいように拡張メソッドにしてやりましょう。

public static class GuidExtensions
{
    public static DateTimeOffset GetTimestamp(this Guid guid)
    {
        if (guid.Version == 7)
        {
            string str = guid.ToString("N")[..12];
            long milliseconds = Convert.ToInt64(str, 16);
            DateTimeOffset timestamp = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);

            return timestamp;
        }
        else
        {
            throw new NotSupportedException("This method is only supported for GUIDs with version 7.");
        }
    }
}

まとめ

UUID v7 に準拠した Guid からタイムスタンプを抜き出す拡張メソッドを実装できました。ここまでやっといてなんですが、データベース上でソートできる点がメリットであって、そこからタイムスタンプを抜き出すのはあまり使わないかもなといったところです。

2
1
0

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
2
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?