C#中的Unix时间转换

use*_*041 35 .net c# datetime unix-timestamp

我试图在unix时间内获得GMT.我使用以下代码:


        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时间转换器,比如这个,它返回完全错误的时间.

另一个问题是我在东部时区.这返回了我所在时区的时间.这是DateTime对象处理的东西还是我没有获得GMT.

Jon*_*eet 121

"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);
}
Run Code Online (Sandbox Code Playgroud)

  • @ErikSchierboom:这取决于 - 有很多场景,其中"自Unix时代以来的秒数"或"自Unix时代以来的毫秒数"被用于*可能*为负的情况.鉴于`long.MaxValue`秒是如此遥远的距离,我认为在1970年之前灵活并接受负值是更有意义的. (8认同)
  • 返回的类型应该是ulong而不是long,因为UNIX时间戳不能为负吗? (2认同)
  • 最近,您现在可以使用DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() (2认同)

arx*_*arx 5

UNIX时间是自1970年1月1日以来的秒数,而不是毫秒.将代码更改为使用秒而不是毫秒,它应该工作,