如何在C#中将Unix纪元时间转换并考虑夏令时?

12

我有一个函数,可以将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() 获取本地Epoch时间(假设现在是17:15:00),这给了我一个值为 1286122500

如果我使用 time.localtime() 将其转换回人类可读时间,它将会转换回我期望的17:15。

如何将Unix Epoch时间转换回 .NET DateTime 值并考虑本地夏令时。我的函数将 1286122500 转换回16:15,这在我的地理位置上是不正确的。

4个回答

21

啊哈...我在 DateTime 构造函数中尝试使用 DateTimeKind.Local,没想到我错过了 .ToLocalTime() 方法。 - Kev

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

在英国夏令时(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

1

你们的夏令时即将结束吗?如果是这样,你们的时区文件可能已经过期,认为它已经结束了。(我不知道英国怎么样,但在美国,夏令时的范围在3年前扩大了,许多安装程序仍然没有更新的数据。)

简而言之,请确保你们的时区数据是最新的。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接