[C#]GoogleProtocolBuffersでTimestampを使用する際の注意点

DateTimeクラスからTimestampクラスに変換するときにハマってはいないけど備忘録として残しておこうと思ったので記事にします。

注意点

DateTimeクラスからTimestampクラスに変換するときには一度UTCに変換して使用しないといけません。

UTCとは

UTCとは簡単に説明するとこんな感じです。

協定世界時 (UTC)とはセシウム原子の振動数をもとに導き出す時間で、今の世界で標準時として使っている時間のこと
日本時間から9時間引いた時間のこと

簡単でもないか。。。

コード

DateTimeクラスをTimestampクラスに変換

var dateTime = new DateTime(2019, 10, 30, 8, 52, 10);
// UTCに変換する
var utcTime = System.TimeZoneInfo.ConvertTimeToUtc(dateTime);

// DateTimeクラスをTimestampクラスに変換
var timestamp = Timestamp.FromDateTime(utcTime);

TimestampクラスをDateTimeクラスに変換

// 現在時刻を取得
var unixTimeMS = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

var seconds = unixTimeMS / 1000;
var nanos = (int)((unixTimeMS % 1000) * 1e6);

var timestamp = new Google.Protobuf.WellKnownTypes.Timestamp()
{
    Seconds = seconds,
    Nanos = nanos
};

// TimestampクラスをDateTimeクラスに変換
var utcTime = timestamp.ToDateTime();

//ローカル時刻に変換する
var localTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, TimeZoneInfo.Local);

まとめ

UTCに変換せずに使おうとすると以下の例外が発生します。DateTimeからTimestampへの変換にはUTCである必要があると言っているので分かりやすいですね。

Conversion from DateTime to Timestamp requires the DateTime kind to be Utc

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA