如何在 Ada 中获得自 unix 纪元以来的秒数?

How to get seconds since unix epoch in Ada?

我觉得很愚蠢,因为我似乎没有得到一个简单的自然数来表示自 Ada 中的 unix 纪元 (01/01/1970 00:00:00) 以来的秒数。我已经阅读了 Ada.Calendar 和它上下的子包,但似乎没有找到实现它的明智方法,即使 Ada.Calendar.Clock 本身应该正是我想要的...

我已经束手无策了。有没有朝着正确的方向推进?

使用 Ada.Calendar.Formatting, construct a Time representing the epoch.

Epoch : constant Time := Formatting.Time_Of(1970, 1, 1, 0.0);

检查 Ada.Calendar.ClockEpoch 之间的区别。

Put(Natural(Clock - Epoch)'Img);

根据此 epoch display 或 Unix 命令 date +%s 检查结果。

有关更多详细信息,请参阅 Rationale for Ada 2005: §7.3 Times and dates and Rationale for Ada 2012: §6.6 General miscellanea

根据 POSIX 标准 UNIX 时间不考虑闰秒,而 Ada.Calendar."-" handles them:

For the returned values, if Days = 0, then Seconds + Duration(Leap_Seconds) = Calendar."–" (Left, Right).

一种选择是使用 Ada.Calendar.Formatting.Split 将 Ada.Calendar.Time 拆分成多个部分,然后使用 POSIX 算法收集回来。

最好的选项似乎是使用Ada.Calendar.Arithmetic.Difference。它 returns 天、秒和 Leap_Seconds。然后,您可以组合 Days * 86_400 + Seconds 以获得 UNIX 时间,并且 Leap_Seconds 将根据 POSIX.

的要求明确丢弃

最近一直在解决这个问题,发了一篇library into public domain

在 Ada 的 GNAT 实现中,有一个私有包 Ada.Calendar.Conversions,其中包含 Calendar 的子级使用的 Ada <-> Unix 转换。