代码之家  ›  专栏  ›  技术社区  ›  UnkwnTech

用C计算未来历元时间#

  •  15
  • UnkwnTech  · 技术社区  · 15 年前

    我能够找到在Linux epoch中获取当前时间戳的示例代码(从1970年1月1日午夜开始的秒数),但是我很难找到一个关于如何计算未来时间戳的示例,例如10分钟之后,那么如何在Linux epoch中计算未来时间?

    4 回复  |  直到 9 年前
        1
  •  29
  •   Noldorin    15 年前

    此扩展方法应完成以下工作:

    private static double GetUnixEpoch(this DateTime dateTime)
    {
        var unixTime = dateTime.ToUniversalTime() - 
            new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
        return unixTime.TotalSeconds;
    }
    

    你可以这样使用它:

    var unixTime1 = DateTime.Now.GetUnixEpoch(); // precisely now
    var unixTime2 = (DateTime.Now + new TimeSpan(0, 10, 0)).GetUnixEpoch(); // 10 minutes in future
    

    请注意,您需要处理 UTC (世界时间),因为Unix时代的开始就是这样定义的。

        2
  •  30
  •   Peter Stuer    9 年前

    当您想了解Windows系统上.NET中的Unix时代时,有一个有趣的转折点。

    对于几乎所有的实际情况,并且假设当前时间已经过了UNIX时代,您确实可以采取

    System.TimeSpan timeDifference = DateTime.UTCNow - 
                new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    long unixEpochTime = System.Convert.ToInt64(timeDifference.TotalSeconds);
    

    但是,

    Unix的epoch time定义为“…描述时间点的系统,定义为自1970年1月1日午夜协调世界时(UTC)以来经过的秒数, 不计算闰秒 “(1)

    自1972年以来,UTC已将“闰秒”包括在内,到目前为止,我们共有25个闰秒。(2)

    .NET日期时间没有闰秒的规定,但只依赖于操作系统时间。Windows幸运地没有意识到闰秒(3)(4),因此它从NTP主机接收时间的概念(我相信非域连接计算机的默认值是time.windows.com),它可能为包括闰秒在内的UTC提供服务。

    这意味着,为了以正确的方式说明自Unix时代以来经过的实际秒数,您可能应该将闰秒添加到上面针对依赖于此的应用程序获得的结果中。您必须跟踪每次添加的秒数,因为闰秒不会提前太久宣布(2)。但是,由于unix epoch time的定义明确地排除了闰秒,因此可以安全地忽略这一点,并且只需从当前的UTC时间重新计算秒。

    有时,闰秒确实会造成软件混乱(5)。关于是否保留或消除这种做法的辩论正在进行(6)(7)(8)。

    回答时的最后一个闰秒发生在2012年7月1日(9),并导致各种网站和应用程序出现问题(10)

    (1) http://en.wikipedia.org/wiki/Unix_time

    (2) http://en.wikipedia.org/wiki/Leap_second

    (3) http://support.microsoft.com/kb/909614

    (4) http://www.meinberg.de/english/info/leap-second.htm

    (5) http://www.networkworld.com/news/2009/010609-leap-second-snafu-affects-oracle.html

    (6) http://www.pcworld.idg.com.au/article/358024/time_waits_no_one_leap_seconds_may_cut/

    (7) http://queue.acm.org/detail.cfm?id=1967009

    (8) http://arxiv.org/abs/1106.3141

    (9) http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat

    (10) http://arstechnica.com/business/2012/07/one-day-later-the-leap-second-v-the-internet-scorecard/

    (最初的答案有一个错误,感谢下面的评论员爱德华·布雷和莫梅吉尔发现了这个错误)

        3
  •  1
  •   Eoin Campbell    15 年前

    你用来计算当前时间的函数是什么?

    当然,这需要一个.NET日期时间参数…

    当然,这只是将未来的日期时间传递给函数的一个简单问题。

    或者在当前时间和未来时间之间以秒为单位执行datediff并将其添加到上。

    var dt = new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime();
    
    var now = System.DateTime.Now.ToUniversalTime();
    var future = new DateTime(2010, 1, 1).ToUniversalTime();
    
    Console.WriteLine((now - dt).TotalSeconds);
    Console.WriteLine((future - dt).TotalSeconds);
    
        4
  •  0
  •   Nick    15 年前

    基本解决方案:

    1. 占用当前时间
    2. 为将来添加偏移量(在示例中为10分钟)
    3. 减去1970年1月1日午夜
    4. 获取两者之间的总秒数

    在C(在我头顶上,未经测试):

    DateTime myEpoch = DateTime.Now.Add( new TimeSpan(...) );
    return myEpoch.Subtract( new DateTime(1970, 1, 1, 0, 0, 0) ).TotalSeconds;