如何打印Ada.Real_.Time变量
如何打印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
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位持续时间。如果没有,或者可能没有,您当然是对的。