我有一个从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);
}
我所在的地方(英国)夏令时时钟前进一小时。
在Python中,我使用time.time()
获取本地大纪元时间(为了争论,现在时间是17:15:00),这给了我1286122500
的值。
如果我使用time.localtime()
将其转换回人类可读时间,它会像我期望的那样转换回17:15。
如何将unix纪元时间转换回.NET DateTime
值和帐户以获取当地夏令时。我上面的函数将1286122500
转换回16:15,这对我的地理位置不正确。
答案 0 :(得分:20)
使用DateTime.ToLocalTime()
:
http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx
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();
}
答案 1 :(得分: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。
答案 2 :(得分:1)
您的夏令时即将结束吗?如果是这样,您的时区文件可能已过期,认为它已经结束。 (我不知道英国,但在美国,夏令时的范围在3年前已经扩大,许多装置仍然没有更新的数据。)
简而言之,请确保您的时区数据是最新的。 : - )
答案 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
)