如何打印 Ada.Real_Time.Time 变量

How to print Ada.Real_Time.Time variable

如何打印Ada.Real_Time.Time变量?

procedure Main is
    test : TValue :=
         (value => 0.7,
          timeStamp => Clock,
          status => (Valid => False, Unknown => True)
         );
begin
  -- print of Test.value
Put(Item => Test.value ,Fore => 5, Aft => 3, Exp => 0);
  -- here I want a print of timestamp

end Main;

我想打印时间戳到控制台,怎么办?我尝试将其转换为字符串或整数,但没有成功

Real_Time.TimeCalendar.Time 之间没有转换,因为 Real_Time 是单调递增的(当然,直到它溢出为止;您应该能够期待至少 50 年的价值, ARM D.8(30)) 而 Calendar 可能会受到夏令时、NTP 更新等的影响。

Ada.Real_Time.Delays.To_Duration会有帮助吗? (这是一个非标准的 GNAT 包)。

我试过了

function To_Duration (T : Ada.Real_Time.Time) return Duration is
   use type Ada.Real_Time.Time;
begin
   return Ada.Real_Time.To_Duration (T - Ada.Real_Time.Time_First);
end To_Duration;

但它失败了(Mac OS X,桌面;可能比 RTOS 工作得更好)

raised CONSTRAINT_ERROR : a-reatim.adb:94 overflow check failed

否则,您可以将 Unchecked_Conversion 用于一些与 Real_Time.Time 大小相同的无符号类型。

经过一番研究,这里有一个简短的示例,说明如何打印 Real_Time.Time

with Ada.Real_Time; use Ada.Real_Time;
with Ada.Calendar;
with Ada.Calendar.Formatting;
with Ada.Text_IO; use Ada.Text_IO;

procedure PrintRT is
      The_Clock : Ada.Real_Time.Time := Ada.Real_Time.Clock;

      -- Convert to Time_Span   
      As_Time_Span : Ada.Real_Time.Time_Span := The_Clock - Time_Of(0, Time_Span_Zero);

      -- Epoch ?
      Epoch : constant Ada.Calendar.Time := Ada.Calendar.Time_Of(1970, 01, 01);

      Dur : Duration := Ada.Real_Time.To_Duration(As_Time_Span);
begin
      Put_Line(Ada.Calendar.Formatting.Image(Ada.Calendar."+"(Epoch, Dur)));
end PrintRT;

获得Time_Span的唯一方法是在两次之间使用“-”运算符。

由于 Seconds_Count 表示从纪元开始的秒数,您可以使用 Time_Of[= 从中构建时间22=].

然后将其转换为持续时间可以让您找到正确的日期。

要阅读的重要部分是 LRM D.8, which defines package Ada.Real_Time. Specifically it is worth noting paragraph 19,其中表示该语言未指定纪元。这意味着要打印 Ada.Real_Time.Time 变量,您必须自己定义一个纪元。一个这样的纪元可能是您正在测试的应用程序的开始时间:

with Ada.Real_Time;
package Real_Time_IO is
   ...
private
   Epoch : constant Ada.Real_Time.Time := Ada.Real_Time.Clock;
end Real_Time_IO;

现在您可以计算自应用程序启动以来的时间跨度:

package body Real_Time_IO is
   function Since_Start return Ada.Real_Time.Time_Span is
   begin
      return Ada.Real_Time.Clock - Epoch;
   end Since_Start;
   ...

如果我们只需要在应用程序启动后最多 24 小时内使用此包,我们可以偷懒,只需将 Since_Start 结果转换为类型 Duration,然后再转换为字符串:

   function Since_Start return Duration is
   begin
      return Ada.Real_Time.To_Duration (Since_Start);
   end Since_Start;

   function Since_Start return String is
   begin
      return Duration'Image (Since_Start);
   end Since_Start;

... 我希望您知道如何打印字符串。 :-)