如何在 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.Clock
和 Epoch
之间的区别。
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 转换。
我觉得很愚蠢,因为我似乎没有得到一个简单的自然数来表示自 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.Clock
和 Epoch
之间的区别。
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 转换。