如何在C#中将unix纪元时间和帐户转换为夏令时?

时间:2010-10-03 16:34:32

标签: c# datetime timezone

我有一个从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,这对我的地理位置不正确。

4 个答案:

答案 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