如何打印 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.Time
和 Calendar.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;
... 我希望您知道如何打印字符串。 :-)
如何打印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.Time
和 Calendar.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;
... 我希望您知道如何打印字符串。 :-)