2011-11-02 40 views
32

Tôi đang cố gắng để có được GMT trong thời gian unix. Tôi sử dụng đoạn mã sau:Chuyển đổi thời gian Unix trong C#

 

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

      return (long)unixTime.TotalMilliseconds; 
     } 
 

Để sau đó chuyển đổi thời gian unix trở về một đối tượng DatTime, tôi sử dụng này:

 

     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; 
     } 
 

Khi tôi chạy nó, GetGMTInMS()1320249196267. Khi tôi chuyển nó đến UnixTimeStampToDateTime() Tôi nhận được {11/2/2011 11:53:16 AM}

Điều đó là tốt. Đó là thời điểm chính xác khi tôi chạy mã của tôi. Vấn đề tôi có là khi tôi thử và đặt 1320249196267 vào bộ chuyển đổi thời gian unix, chẳng hạn như this, nó trả về thời gian hoàn toàn sai.

Vấn đề khác, là tôi đang ở múi giờ phía đông. Điều này trả về thời gian trong múi giờ của tôi. Đây có phải là điều mà đối tượng xử lý đối tượng DateTime hoặc tôi không nhận được GMT.

Trả lời

107

"Dấu thời gian của Unix" nghĩa là giây từ kỷ nguyên trong hầu hết các trường hợp thay vì mili giây ... hãy cẩn thận! Tuy nhiên, những thứ như Java sử dụng "mili giây kể từ thời đại" có thể là những gì bạn thực sự là quan tâm - mặc dù công cụ bạn đã hiển thị. Nó thực sự phụ thuộc vào những gì bạn cần.

Ngoài ra, bạn không nên làm bất cứ điều gì với giờ địa phương. Dính vào thời gian toàn cầu.

tôi sẽ có:

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

Loại trả về có phải là 'ulong' thay vì dài, vì dấu thời gian UNIX không được âm? –

+6

@ErikSchierboom: Vâng điều đó phụ thuộc - có rất nhiều kịch bản trong đó "giây kể từ thời đại Unix" hoặc "mili giây kể từ thời đại Unix" được sử dụng trong đó chúng * có thể * là âm. Cho rằng 'long.MaxValue' giây là bao giờ như vậy một chặng đường dài đi, tôi nghĩ rằng nó có ý nghĩa hơn để được linh hoạt và chấp nhận giá trị tiêu cực cho thời gian trước khi 1970. –

+0

Được rồi, tôi hiểu! Cảm ơn lời giải thích. –

5

Thời gian UNIX là giây kể từ 1/1/1970, không phải là mili giây. Thay đổi mã để sử dụng giây thay vì mili giây và mã sẽ hoạt động,

+0

tôi thấy không có lý do cho việc sử dụng thời gian địa phương * * bất cứ nơi nào trong mã của OP. .. Tôi không * nghĩ * nó phá vỡ bất cứ điều gì trong trường hợp này, nhưng nó làm cho mã khó xác minh hơn. –

Các vấn đề liên quan