2011-11-02 17 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的代码。 ..我不认为它在这种情况下破坏了任何东西,但它使代码更难以验证。 –