16

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

4

4 回答 4

32

这种扩展方法应该可以完成这项工作:

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 纪元开始的方式。

于 2009-05-25T09:31:40.550 回答
32

当您想在 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 DateTime 没有关于闰秒的规定,但只会依赖操作系统时间。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/

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

于 2009-05-25T11:12:07.040 回答
1

基本解决方案:

  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;
于 2009-05-25T09:31:34.310 回答
1

你用什么函数来获取当前时间?

当然,这需要一个 .NET DateTime 参数......

当然,这只是将未来的 DateTime 传递给函数的简单问题。

或在当前时间和未来时间之间以秒为单位执行 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);
于 2009-05-25T09:32:57.287 回答