如何打印Ada.Real_Time.Time变量

时间:2015-05-06 08:23:48

标签: time ada

如何打印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;

我想将timeStamp打印到控制台,怎么做?我试图将它转换为String或Integer,但没有成功

4 个答案:

答案 0 :(得分:3)

经过一些研究,这是一个如何打印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 表示Epoch的秒数,您可以使用 Time_Of 从中构建时间。

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

答案 1 :(得分:3)

要阅读的重要部分是LRM D.8,其中定义了package Ada.Real_Time。具体而言,值得注意的是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;

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

答案 2 :(得分:2)

Real_Time.TimeCalendar.Time之间没有转换,因为Real_Time是单调增加的(当然它会溢出;你应该能够期望至少50年的价值,{{ 3}})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相同大小的无符号类型。

答案 3 :(得分:-1)

使用ada.calendar.formatting包,例如:

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

procedure Main is
begin
   Put_Line(Image(Date => Clock, Time_Zone => Ada.Calendar.Time_Zones.UTC_Time_Offset) & ": Timeout");
end Main;

但是如果你想要原始数字你可以使用未经检查的覆盖到有符号整数64.(请注意,ada时代不是unix时代)