2010-10-03 151 views
10

我有一個從Unix紀元時間轉換爲.NET DateTime值的函數:我如何從UNIX時代轉換時間並在C#中考慮夏令時?

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

我在哪裏(UK)的時鐘走1小時着夏天的時間。

在Python中,我使用time.time()(爲了爭辯,現在時間是17:15:00)得到當地的大紀元時間,這給我的值爲1286122500

如果我使用time.localtime()轉換這回人類可讀的時候將其轉換回17:15,因爲我期望的那樣。

如何轉換Unix紀元時間回.NET DateTime價值,佔本地夏令時。我上面的功能將1286122500轉換回16:15,這對我的地理位置不正確。

回答

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(); 
} 
+0

+1,這裏不需要更復雜。 – 2010-10-03 17:10:02

+0

啊哈...我在DateTime構造函數中試過'DateTimeKind.Local',不敢相信我錯過了'.ToLocalTime()'方法。 – Kev 2010-10-03 17:23:45

+0

古老但很好。謝謝。 – kmarks2 2012-03-16 12:29:47

1

是您的夏令即將結束?如果是這樣,你的時區文件可能會過時,認爲它已經結束。 (我不瞭解英國,但在美國,夏令時的範圍在3年前擴大了,許多安裝仍然沒有更新的數據。)

總之,請確保您的時區數據是最新的。 :-)

+0

他們沒有過時。也是Python得到這個權利。 – Kev 2010-10-03 17:18:11

1

這是17:15在BST 1286122500(或GMT + 1)時區(英國夏令時間)。

你的函數使用DateTimeKind.Utc告訴它使用UTC(又名GMT),讓你在格林尼治標準時間獲取時間:16:15。另外,我不認爲改變unix時代參考的時區必須正確地影響你當前的本地時區。

相反,你可以嘗試這樣的事:

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

(然後轉換爲DateTimeKind.Local

5

TimeZoneInfo類很高興在h以不同的時間和時區來處理一筆交易。它使用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。

相關問題