如何打印Ada.Real_.Time变量

如何打印Ada.Real_.Time变量,time,ada,Time,Ada,如何打印Ada.Real_.Time变量 procedure Main is test : TValue := (value => 0.7, timeStamp => Clock, status => (Valid => False, Unknown => True) ); begin -- print of Test.value Put(Item => Test.valu

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

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

实时时间
日历时间
之间没有转换,因为
实时时间
是单调递增的(当然,直到它溢出为止;你应该能够预期至少50年的价值,)而
日历
可能会受到夏令时、NTP更新等的影响

Ada.Real\u Time.Delays.To\u Duration
是否有帮助?(这是一个非标准的蚊虫包)

我试过了

函数到\u Duration(T:Ada.Real\u Time.Time)返回的持续时间为
使用Ada.Real_.Time类型;
开始
返回Ada.Real\u Time.To\u Duration(T-Ada.Real\u Time.Time\u First);
结束持续时间;
但它失败了(MacOSX,桌面;在RTOS上可能工作得更好)

raised CONSTRAINT\u错误:a-reatm.adb:94溢出检查失败


否则,您可以使用
未经检查的\u转换
到与
Real\u Time.Time

大小相同的无符号类型。经过一些研究,下面是一个如何打印Real\u 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;
获取时间跨度的唯一方法是在两次之间使用“-”运算符

由于Seconds_Count表示从历元开始的秒数,因此可以使用Time_of从历元开始构建时间


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

需要阅读的重要部分是,它定义了包Ada.Real\u Time。特别值得一提的是,语言并没有规定时代。这意味着要打印
Ada.Real\u Time.Time
变量,您必须自己定义一个历元。其中一个时期可能是您正在测试的应用程序的开始时间:

使用Ada.Real\u Time;
包实时IO是
...
私有的
历元:常数Ada.Real\u Time.Time:=Ada.Real\u Time.Clock;
结束实时IO;
现在,您可以计算自应用程序启动以来的时间跨度:

包体实时IO为
函数自启动返回Ada.Real\u Time.Time\u Span为
开始
返回Ada.Real_Time.Clock-Epoch;
从一开始就结束;
...
如果我们只需要在应用程序启动后24小时内使用此软件包,我们可以延迟,只需将
Since\u start
结果转换为类型
Duration
,然后转换为字符串:

函数,因为\u开始返回持续时间为
开始
返回Ada.Real_Time.To_Duration(自_开始);
从一开始就结束;
函数的起始返回字符串为
开始
返回持续时间的图像(自开始);
从一开始就结束;

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

您还可以使用函数“-”(左:时间;右:时间)获取一个时间跨度对象,您可以在该对象上应用to_持续时间(TS:Time_跨度)。然后使用Ada.Calendar的格式化包和Calendar.Time上的运算符,您可以按照预期重新生成和显示时间。看起来您还没有阅读RM D.8(19)[.Ada.Real_Time的时代尚未确定。是的,我见过它,但它至少在我的Linux机器上起作用:)因此,它为MartinBIf提供了一种可能的调查方法。如果你使用GNAT,
Duration'Last
是一个非常大的数字(通常>10^20)。是的,但你只能保证24小时(并且没有闰秒)。如果您使用GNAT,您可以使用lsb 1纳秒(~300年)的64位
持续时间,也可以使用lsb 20毫秒(~500天)的32位
持续时间。如果没有,或者可能没有,您当然是对的。