10


0

UNIXエポック時間から変換し、C#で夏時間を考慮するにはどうすればよいですか?

UNIXエポック時間から.NET DateTime値に変換する関数があります。

public static DateTime FromUnixEpochTime(double unixTime )
{
  DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  return d.AddSeconds(unixTime);
}

私(英国)の時計は、夏時間のために1時間進みます。

Pythonでは、 `time.time()`を使用してローカルエポック時間を取得します(そして、議論のために、現在の時間は17:15:00です)。これにより、値は `1286122500`になります。

これを `time.localtime()`を使用して人間が読める時間に変換すると、予想どおり17:15に変換されます。

UNIXエポック時間を.NETの `DateTime`値に戻し、ローカルの夏時間を考慮する方法 上記の関数は、 `1286122500`を16:15に変換しますが、これは私の地理的な場所では正しくありません。

4 Answer


20


`DateTime.ToLocalTime()`を使用します:

public static DateTime FromUnixEpochTime(double unixTime)
{
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    d = d.AddSeconds(unixTime);
    return d.ToLocalTime();
}


5


TimeZoneInfoクラスは、さまざまな時間帯とタイムゾーンでの対処に役立ちます。 Windowsに組み込まれているタイムゾーン情報を使用して、異なるタイムゾーン間で変換します。

問題にそれを使用する方法は次のとおりです。

//Get your unix epoch time into a DateTime object
DateTime unixTime =
    new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc).AddSeconds(1286122500);

//Convert to local time
DateTime localTime = TimeZoneInfo.ConvertTime(unixTime, TimeZoneInfo.Local);

TimeZoneInfo.Localは、ローカルタイムゾーンを表すTimeZoneInfoを返します。


1


夏時間はもうすぐ終わりますか? その場合、タイムゾーンファイルはすでに終了していると考えて、古くなっている可能性があります。 (英国については知りませんが、米国では、3年前に夏時間の範囲が拡大され、多くのインストールではまだ更新されたデータがありません。)

つまり、タイムゾーンデータが最新であることを確認してください。 :-)


1


BST(またはGMT + 1)タイムゾーン(ブリティッシュサマータイム)の1286122500の場合、17:15です。

あなたの関数は `DateTimeKind.Utc`を使用し、UTC(別名GMT)を使用するように指示しているため、GMT:16:15で時刻を取得します。 さらに、UNIXエポック参照のタイムゾーンを変更しても、現在のローカルタイムゾーンに正しく影響する必要はないと思います。

代わりに、次のようなものを試すことができます。

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime d = unixEpoch + new TimeSpan(unixTime);

(そして、 `DateTimeKind.Local`に変換します)