C# C语言中的Unix时间转换#

C# C语言中的Unix时间转换#,c#,.net,datetime,unix-timestamp,C#,.net,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.TotalMil

我正试图在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。

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

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

我看不出有任何理由在OP的代码中使用本地时间。。我不认为在这种情况下它会破坏任何东西,但它会使代码更难验证。返回的类型应该是
ulong
而不是long,因为UNIX时间戳不能是负数吗?@Erikschierbom:这要看情况而定-有很多场景是“从UNIX纪元开始的秒数”或“从UNIX纪元开始的毫秒数”在可能为负数的地方使用。考虑到
long.MaxValue
seconds离我们还有很长的路要走,我认为在1970年之前灵活地接受负值是更有意义的。好吧,我明白了!感谢您的解释。最近您可以使用DateTimeOffset.UtcNow.TounixTimeMillimes()了