[C#] UnixTimeを変換する方法

[C#] UnixTimeを変換する方法

C# で UnixTime を変換する方法

UnixTimeとは、1970年1月1日からの経過秒数で表される日付の形式です。文字通りUnix系のOSで使われる表現方法でもあります。

.NET4.6以降では、標準での変換方法が提供されていますが、それ以前では変換関数を用意する必要があります。
DateTime型からUnixTimeへの変換とその逆の変換について、サンプルを以下に示します。

.NET Framework 4.6以降の場合

DateTimeOffset 構造体

ToUnixTimeSecondsメソッド

FromUnixTimeSecondsメソッド
を利用すれば簡単に変換できます。

DateTimeOffsetは特定の時点を表します。通常、世界協定時刻 (UTC) を基準とする相対的な日時として表されます。
つまり、最終的に日本時間として扱うためには、9時間の差を考慮する必要あります。

下記例ではUnixTimeへの変換時、あらかじめ9時間プラスしています。
DateTime型への変換ではLocalDateTimeで日本時間を取得しています。

using System;
public class Program
{
    static void Main(string[] args)
    {
      // 変換する日付
      var dt = new DateTime(2016, 8, 17);

      // DateTime型からUnixTimeへの変換
      var unixTime = ToUnixTime(dt);
      Console.WriteLine(unixTime); // 1471359600

      // UnixTimeから日付型への変換
      var dateTime = FromUnixTime(unixTime);
      Console.WriteLine(dateTime);

      Console.ReadKey();
    }

    public static long ToUnixTime(DateTime dt)
    {
        var dto = new DateTimeOffset(dt.Ticks, new TimeSpan(+09, 00, 00));
        return dto.ToUnixTimeSeconds();
    }
    public static DateTime FromUnixTime(long unixTime)
    {
        return DateTimeOffset.FromUnixTimeSeconds(unixTime).LocalDateTime;
    }
}

.NET Framework 4.5以前の場合

.NET Framework 4.5以前の場合は自前の変換処理を書く必要があります。
まずは基準となる1970年1月1日のUTC時間を定義します。

UnixTimeへの変換はこの基準日時との差分から求まります。

UnixTimeからDateTime型への変換は、基準日時からUnixTimeで表される秒数を加算して得られる日付で求まります。
ただし、基準としている日付はUTC時間なので、ここで求まる日時もUTCのそれとなります。
なので現地時間(日本時間)で求める場合は、LocalTimeに変換してやりましょう。

using System;
public class Program
{
    static void Main(string[] args)
    {
        // 変換する日付
        var dt = new DateTime(2016, 8, 17);

        // DateTime型からUnixTimeへの変換
        var unixTime = ToUnixTime(dt);
        Console.WriteLine(unixTime); // 1471359600

        // UnixTimeから日付型への変換
        var dateTime = FromUnixTime(unixTime);
        Console.WriteLine(dateTime);

          Console.ReadKey();
    }

    public static DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    public static long ToUnixTime(DateTime targetTime)
    {
        // UTC時間に変換
        targetTime = targetTime.ToUniversalTime();
        // UNIXエポックからの経過時間を取得
        TimeSpan elapsedTime = targetTime - UNIX_EPOCH;
        // 経過秒数に変換
        return (long)elapsedTime.TotalSeconds;
    }

    public static DateTime FromUnixTime(long unixTime)
    {
        // UNIXエポックからの経過秒数で得られるローカル日付
        return UNIX_EPOCH.AddSeconds(unixTime).ToLocalTime();
    }
}

C#カテゴリの最新記事