我能够找到示例代码来获取Linux Epoch中的当前时间戳(1970年1月1日午夜以来的秒数),但是我很难找到一个例子来说明如何计算Epoch将来会是什么,比如说例如,从现在起10分钟后,我如何计算Linux Epoch的未来时间?
答案 0 :(得分: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);
但是,
Unix Epoch Time被定义为“...一个用于描述时间点的系统,定义为自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抓到了)
答案 1 :(得分: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;
}
你可以这样使用它:
var unixTime1 = DateTime.Now.GetUnixEpoch(); // precisely now
var unixTime2 = (DateTime.Now + new TimeSpan(0, 10, 0)).GetUnixEpoch(); // 10 minutes in future
请注意,您需要处理 UTC (通用时间)中的所有日期时间,因为这是定义Unix Epoch开始的方式。
答案 2 :(得分: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);
答案 3 :(得分:0)
基本解决方案:
在c#中(我的头顶,未经测试):
DateTime myEpoch = DateTime.Now.Add( new TimeSpan(...) );
return myEpoch.Subtract( new DateTime(1970, 1, 1, 0, 0, 0) ).TotalSeconds;