タイムスタンプとは、基本的に1970年1月1日0時0分0秒(UTC)から現在までの経過時間を秒またはミリ秒で表したものです。 一般的に、秒単位のタイムスタンプは10桁、ミリ秒単位のタイムスタンプは13桁になります。
一、日時と秒単位タイムスタンプの変換
1、日時を秒単位タイムスタンプに変換
DateTime currentMoment = DateTime.Now;
DateTime epochStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
TimeSpan timeDifference = currentMoment - epochStart;
long timestampInSeconds = (long)timeDifference.TotalSeconds;
Console.WriteLine(timestampInSeconds);
2、秒単位タイムスタンプを日時に変換
long timestampValue = 1629160713;
DateTime epochStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
DateTime convertedTime = epochStart.AddSeconds(timestampValue);
二、日時とミリ秒単位タイムスタンプの変換
1、日時をミリ秒単位タイムスタンプに変換
DateTime utcEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
TimeSpan timeSpan = DateTime.UtcNow - utcEpoch;
long timestampInMilliseconds = (long)timeSpan.TotalMilliseconds;
Console.WriteLine(timestampInMilliseconds);
2、ミリ秒単位タイムスタンプを日時に変換
long millisecondTimestamp = 1629160713000;
DateTime epochStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
DateTime convertedDateTime = epochStart.AddMilliseconds(millisecondTimestamp);
注意点:
UtcNowはUTC(協定世界時)を取得しますが、TimeZoneInfo.ConvertTimeFromUtcを使用して現地時区に変換できます。そのため、タイムスタンプとの差を計算する際に2つの異なるアプローチが存在します。
// 現地時区を使用
DateTime localEpochStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
TimeSpan localTimeSpan = DateTime.Now - localEpochStart;
// UTCを使用
DateTime utcEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
TimeSpan utcTimeSpan = DateTime.UtcNow - utcEpoch;
新しい方法
TimeZoneクラスを使用していると、Visual Studioから警告メッセージが表示されることがあります。TimeZoneInfoクラスは、システム上で定義された任意のタイムゾーンを処理したり、新しいタイムゾーンを作成したり、日時をタイムゾーン間で簡単に変換したりできます。現在、TimeZoneクラスは基本的にTimeZoneInfoクラスに取って代わられつつあります。
TimeZoneInfoを使用したタイムスタンプ処理の例:
string timeZoneId = TimeZoneInfo.Local.Id;
DateTime baseUtcTime = new DateTime(1970, 1, 1);
DateTime localEpochTime = TimeZoneInfo.ConvertTimeFromUtc(baseUtcTime, TimeZoneInfo.Local);
long timestampValue = 1525779812; // タイムスタンプ
DateTime convertedFromSeconds = localEpochTime.AddSeconds(timestampValue); // 秒単位タイムスタンプから日時に変換
DateTime convertedFromMilliseconds = localEpochTime.AddMilliseconds(timestampValue); // ミリ秒単位タイムスタンプから日時に変換
その他の方法
DateTime targetTime = new DateTime(2023, 05, 01, 10, 11, 12);
Console.WriteLine(targetTime); // 2023/05/01 10:11:12
long unixTimestamp = new DateTimeOffset(targetTime.ToUniversalTime()).ToUnixTimeSeconds(); // 1682907072
Console.WriteLine(DateTimeOffset.FromUnixTimeSeconds(unixTimestamp).LocalDateTime); // 2023/05/01 10:11:12