用C#计算未来的纪元时间

Unk*_*ech 15 c# time epoch

我能够找到示例代码来获取Linux Epoch中的当前时间戳(1970年1月1日午夜以来的秒数),但是我很难找到如何计算Epoch未来的例子,例如10从现在起几分钟,我怎样才能计算Linux Epoch的未来时间?

Pet*_*uer 31

当你想知道Windows系统上.Net中的Unix Epoch时间时,有一个有趣的转折.

对于几乎所有的实际案例,并假设当前的时间已经超过了Unix Epoch,你确实可以采取

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

但,

Unix纪元时间被定义为"......用于描述时间点的系统,定义为自1970年1月1日午夜协调世界时(UTC)以来经过的秒数,不计算闰秒." (1)

自1972年以来,UTC已经包含了"闰秒",到目前为止我们共有25个.(2)

.Net DateTime没有针对Leap Seconds的规定,但仅仅依赖于操作系统时间.Windows幸福地没有意识到Leap Seconds(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/

(最初的答案有一个错误,幸好被下面的评论者Edward Brey和Mormegil抓住了)

  • 我不_think_这是正确的.这两个假设都很好(Unix和Windows都不计算/知道闰秒),但你做出了错误的结论,恕我直言.Unix时间忽略了闰秒,这意味着它认为`1973-01-01T00:00:00Z`是Unix时间94694400,即`(365 + 366 + 365)*24*60*60`,即使两个闰秒已经过去了与此同时.对于Windows来说,情况完全相同.它从NTP主机知道它是'1973-01-01T00:00:00Z`,但它不知道大约两个闰秒.Unix和Windows时间不是连续的时间尺度,但它们彼此同步. (3认同)
  • 实际的 Unix 实现是迂腐正确的。它的基于纪元的数学不考虑闰秒,这符合官方定义。澄清一下,这是一个迂腐的问答:1973-01-01T00:00:00Z 的 Unix 纪元时间是什么?94694400. 从 1970-01-01T00:00:00Z 到 1973-01-01T00:00:00Z 过去了多少秒?94694402。 (2认同)

Nol*_*rin 30

这个扩展方法应该做的工作:

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

    return unixTime.TotalSeconds;
}
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

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

请注意,您需要以UTC(通用时间)处理所有日期时间,因为这是定义Unix Epoch的开始的方式.