如何打印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,但没有成功
答案 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.Time
和Calendar.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时代)