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();
}
}
コメントを書く