C#におけるUnixタイムスタンプとDateTimeの相互変換のコード例
C#におけるUnixタイムスタンプとDateTimeの相互変換
Unixタイムスタンプとは、1970年1月1日 UTCからの経過秒数を表す数値です。C#では、これを DateTime
型に変換し、その逆も可能となります。
UnixタイムスタンプからDateTimeへの変換
using System;
// Unixタイムスタンプの例
long unixTimestamp = 1693340800; // 2024年8月27日 17:00 UTC
// UnixタイムスタンプからDateTimeへの変換
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
.AddSeconds(unixTimestamp);
DateTimeKind.Utc
:DateTime
オブジェクトのタイムゾーンを UTC に設定します。AddSeconds
: Unixタイムスタンプの秒数を追加して、適切なDateTime
オブジェクトを作成します。
DateTimeからUnixタイムスタンプへの変換
// DateTimeの例
DateTime dateTime = DateTime.UtcNow;
// DateTimeからUnixタイムスタンプへの変換
long unixTimestamp = (long)(dateTime - DateTime.UnixEpoch).TotalSeconds;
DateTime.UnixEpoch
: 1970年1月1日 UTC のDateTime
オブジェクトです。TotalSeconds
:TimeSpan
オブジェクトの総秒数を取得します。
注意:
- タイムゾーンを正しく扱うことが重要です。特に、ローカルタイムと UTC タイムの違いに注意してください。
- 大量の変換を行う場合は、パフォーマンスを考慮し、最適化手法を検討することが必要かもしれません。
using System;
// Unixタイムスタンプの例
long unixTimestamp = 1693340800; // 2024年8月27日 17:00 UTC
// UnixタイムスタンプからDateTimeへの変換
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
.AddSeconds(unixTimestamp);
Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss")); // 出力: 2024-08-27 17:00:00
// DateTimeの例
DateTime dateTime = DateTime.UtcNow;
// DateTimeからUnixタイムスタンプへの変換
long unixTimestamp = (long)(dateTime - DateTime.UnixEpoch).TotalSeconds;
Console.WriteLine(unixTimestamp); // 出力: 現在のUnixタイムスタンプ
解説:
DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
: 1970年1月1日 UTCのDateTime
オブジェクトを作成します。ToString("yyyy-MM-dd HH:mm:ss")
:DateTime
オブジェクトを指定したフォーマットで文字列に変換します。
DateTime.UtcNow
: 現在の UTC 時間のDateTime
オブジェクトを取得します。dateTime - DateTime.UnixEpoch
: 2つのDateTime
オブジェクトの差をTimeSpan
オブジェクトとして取得します。(long)
:double
型の値をlong
型に変換します。
DateTimeOffsetの使用
- 利点: タイムゾーン情報を保持できるため、より正確な日時表現が可能。
- コード例:
// UnixタイムスタンプからDateTimeOffsetへの変換
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(unixTimestamp);
// DateTimeOffsetからUnixタイムスタンプへの変換
long unixTimestamp = dateTimeOffset.ToUnixTimeSeconds();
TimeSpanの利用
- 利点:
DateTime
とUnixタイムスタンプの差を直接計算できる。
// UnixタイムスタンプからTimeSpanへの変換
TimeSpan timeSpan = TimeSpan.FromSeconds(unixTimestamp);
// TimeSpanからDateTimeへの変換
DateTime dateTime = DateTime.UnixEpoch + timeSpan;
// DateTimeからTimeSpanへの変換
TimeSpan timeSpan = dateTime - DateTime.UnixEpoch;
DateTime.FromBinaryとDateTime.ToBinary
- 利点:
DateTime
オブジェクトをバイナリ形式で直接操作できる。
// UnixタイムスタンプからDateTimeへの変換
DateTime dateTime = DateTime.FromBinary(unixTimestamp * 10000000); // 10000000は100ナノ秒を表す
// DateTimeからUnixタイムスタンプへの変換
long unixTimestamp = (long)(dateTime.ToBinary() / 10000000);
DateTimeOffset
はタイムゾーン情報を保持するため、より正確な日時表現が可能です。TimeSpan
は直接差を計算できるため、特定のユースケースでは効率的です。DateTime.FromBinary
とDateTime.ToBinary
はバイナリ形式で直接操作できるため、パフォーマンスを重視する場合に有用です。
c# datetime unix