C#におけるタイムスタンプと日時の相互変換

タイムスタンプとは、基本的に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

タグ: C# タイムスタンプ 日時変換 TimeZoneInfo DateTimeOffset

6月28日 18:58 投稿