【问题标题】:Unix time conversions in C# [duplicate]C#中的Unix时间转换[重复]
【发布时间】:2011-12-20 11:19:17
【问题描述】:

我正在尝试以 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 时间转换器(例如 this)时,它返回的时间完全错误。

另一个问题是我在东部时区。这返回了我时区的时间。这是DateTime 对象处理的东西还是我没有得到格林威治标准时间。

【问题讨论】:

    标签: c# .net datetime unix-timestamp


    【解决方案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);
    }
    

    【讨论】:

    • 返回的类型应该是ulong而不是long,因为UNIX时间戳不能为负数?
    • @ErikSchierboom:这取决于 - 有很多场景使用“自 Unix 纪元以来的秒数”或“自 Unix 纪元以来的毫秒数”,它们可以为负数.鉴于long.MaxValue 秒距离如此遥远,我认为灵活并接受 1970 年之前的负值更有意义。
    • 好的,我明白了!谢谢你的解释。
    • 最近可以使用 DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
    【解决方案2】:

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

    【讨论】:

    • 我认为没有理由在 OP 的代码中使用本地时间 anywhere。 .. 我不认为在这种情况下它会破坏任何东西,但它会使代码更难验证。
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2018-01-21
    • 2014-08-07
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多