2013-03-05 97 views
2

下面的函数应该以下UNIX时间转换为C#DateTime对象:Unix的日期时间差异

的时间以上应该代表2012年3月5日下午12点54

然而,每次我通过下面的函数运行它,它改变下午5时54

2013年3月5日下午5时54分46秒

static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
    static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds; 

    public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) 
    { 
     return unixTimeStamp > MaxUnixSeconds 
      ? UnixEpoch.AddMilliseconds(unixTimeStamp) 
      : UnixEpoch.AddSeconds(unixTimeStamp); 
    } 

我怎样才能得到的unix时间被正确地表示为12:54而不是5:54

+3

你可能需要查找的功能转换GMT(或者是UTC可好?)到本地时间。也许这将有助于:语言可能不同,但所需的功能通常在不同语言中有相同或非常相似的名字。 – 2013-03-05 18:43:47

+0

好问题;我不知道他们给我发了什么时区。我只知道它应该是12:54,当我把它插入到我的函数中时,它会出来5:45 ... – user1477388 2013-03-05 19:01:21

+0

@ user1477388:你应该总是问自己什么时区是日期或时间,在做任何事情之前它。 – 2013-03-05 19:28:28

回答

0

的修复,对我来说,是添加ToLocalTime()的代码,就像这样:

static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds; 

public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) 
{ 
    return unixTimeStamp > MaxUnixSeconds 
     ? UnixEpoch.AddMilliseconds(unixTimeStamp).ToLocalTime() 
     : UnixEpoch.AddSeconds(unixTimeStamp).ToLocalTime(); 
} 
+1

小心 - “ToLocalTime()'现在可能会得到一个对你有意义的值 - 但除非你能保证时间标记来自同一时区或UTC,否则这会给你带来麻烦。但是 - unix时间戳*应该*为UTC。只要确保当地时间真的是你以后的事情。 – 2013-03-06 00:24:33

+0

谢谢,马特;我会考虑这一点。 – user1477388 2013-03-06 15:21:34

2

这听起来像是一个时区问题。确保用于生成Unix时间的时区与Windows系统上的时区相同,或者相应地进行转换。