やりたいこと
前回の記事で 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);
Console。WriteLine(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 からタイムスタンプを抜き出す拡張メソッドを実装できました。ここまでやっといてなんですが、データベース上でソートできる点がメリットであって、そこからタイムスタンプを抜き出すのはあまり使わないかもなといったところです。