2011-11-02 28 views
32

我想在unix時間獲得GMT。我使用下面的代碼:在C#中的Unix時間轉換

 

     public static long GetGMTInMS() 
     { 
      var unixTime = DateTime.Now.ToUniversalTime() - 
       new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

      return (long)unixTime.TotalMilliseconds; 
     } 
 

要那麼UNIX時間轉換回DatTime對象,我用這個:

 

     public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) 
     { 
      System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); 
      dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime(); 
      return dtDateTime; 
     } 
 

當我運行它時,GetGMTInMS()1320249196267。當我通過它UnixTimeStampToDateTime()我得到{11/2/2011 11:53:16 AM}

這是好的。這是我運行代碼時的正確時間。我遇到的問題是,當我嘗試將1320249196267放入unix時間轉換器(例如this)時,它會返回完全錯誤的時間。

另一個問題,我是在東部時區。這返回了我的時區。這是DateTime對象處理的事情,還是我沒有得到GMT?

回答

107

「Unix時間戳」是指因爲在大多數情況下,時代,而不是毫秒......要小心!然而,像Java這樣的東西使用「時代以來的毫秒數」,儘管您展示的工具儘管可能是實際上關心的東西。這真的取決於你需要什麼。

此外,你不應該做任何事情與當地時間。堅持世界各地的時間。

我會:

private static readonly DateTime UnixEpoch = 
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

public static long GetCurrentUnixTimestampMillis() 
{ 
    return (long) (DateTime.UtcNow - UnixEpoch).TotalMilliseconds; 
} 

public static DateTime DateTimeFromUnixTimestampMillis(long millis) 
{ 
    return UnixEpoch.AddMilliseconds(millis); 
} 

public static long GetCurrentUnixTimestampSeconds() 
{ 
    return (long) (DateTime.UtcNow - UnixEpoch).TotalSeconds; 
} 

public static DateTime DateTimeFromUnixTimestampSeconds(long seconds) 
{ 
    return UnixEpoch.AddSeconds(seconds); 
} 
+1

返回的類型應該是'ulong'而不是很長,因爲UNIX時間戳不能爲負數? –

+6

@ErikSchierboom:那取決於 - 有很多情況下,「自Unix時代以來的秒數」或「自Unix時代以來的毫秒數」被用於*可能爲負數的情況。鑑於'long.MaxValue'秒的時間距離很遠,我認爲在1970年之前變得更靈活並接受負值是更合理的。 –

+0

好吧,我明白了!感謝您的解釋。 –

5

UNIX時間是自1970年1月1日以來的秒數,而不是毫秒。更改爲使用秒,而不是毫秒的代碼,它應該工作,

+0

我認爲沒有理由對使用本地時間* *任何地方在OP的代碼。 ..我不認爲它在這種情況下破壞了任何東西,但它使代碼更難以驗證。 –