2010-07-28 379 views
76

我試圖將C#DateTime變量轉換爲Unix時間,即自1970年1月1日以來的秒數。它看起來像DateTime實際上是自1月1日起的'ticks'的數量。如何將日期時間轉換爲自1970年以來的秒數?

我現在的想法是從我的DateTime這樣減去1970年1月1日:

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0)); 
return span.TotalSeconds; 

有沒有更好的辦法?

回答

137

基本上就是這樣。這些都是我用它來轉換和從Unix紀元時間的方法:

public static DateTime ConvertFromUnixTimestamp(double timestamp) 
{ 
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
    return origin.AddSeconds(timestamp); 
} 

public static double ConvertToUnixTimestamp(DateTime date) 
{ 
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
    TimeSpan diff = date.ToUniversalTime() - origin; 
    return Math.Floor(diff.TotalSeconds); 
} 
+1

應該值得注意的是,如果你想轉換爲millseconds對於任何一個更準確的時間戳或Javascript Date()對象的兼容性,您需要使用long而不是int作爲時間戳類型。 – Soviut 2013-02-08 04:58:03

+3

沒有爲我工作。這個答案有訣竅:http://stackoverflow.com/questions/249760/how-to-convert-unix-timestamp-to-datetime-and-vice-versa – Zeezer 2014-01-02 14:11:02

+0

@Jonny - ToUniversalTime()轉換爲UTC,所以它確實佔UTC時間。 – 2014-12-12 14:22:45

21

我唯一看到的是,它應該是因爲午夜1970年1月1日UTC

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc)); 
return span.TotalSeconds; 
+4

它應該是DateTime.UtcNow? – oferei 2017-06-12 09:55:36

0

你可以創建DateTime的startTime和endTime,然後執行endTime.Subtract(startTime)。然後輸出你的span.Seconds。

我認爲這應該工作。

13

你可能想使用DateTime.UtcNow避免時區問題

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 
1

這種做法將是一件好事,如果日期,時間問題是UTC,或者表示從未觀察到的地區當地時間夏令時。 DateTime差異例程不考慮夏令時,因此將6月1日午夜視爲1月1日午夜後24小時的倍數。我不瞭解Windows中報告當前歷史夏令時規則的任何內容所以我不認爲在最近的夏令時規則更改之前有任何好的方法可以正確處理任何時間。

21

如果你的系統的其餘部分是用的DateTimeOffset而不是日期時間OK,有一個非常方便的功能:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds(); 
+5

這是一種更簡潔的方式,但它僅適用於框架4.6 https://msdn.microsoft.com/zh-cn/library/system.datetimeoffset.tounixtimeseconds(v=vs.110).aspx – 2016-12-23 15:42:32

相關問題