如何将时间值(例如:33h 24m 02s)存储在TIME
变量中,因为*HIVAL
- 最大值 - 是24h 00m 00s。
当有时(当值小于10时)将其存储在数据结构(DS)中时,例如:33:24:03,该值显示为33.24.3,因为该字段没有自动填充零
答案 0 :(得分:4)
你已经回答了自己的问题,限制是24小时。
我不确定您要完成的是什么,但我建议您使用%diff()内置函数(BIF)来获取两个时间/日期/时间戳值之间的差异将它存储在整数中。然后操纵另一个时间/时间戳字段,您可以使用%seconds() BIF。
例如:
ctl-opt dftactgrp(*no) actgrp(*new);
ctl-opt timfmt(*iso);
dcl-s time1 time inz(t'09.25.00');
dcl-s time2 time inz(t'10.00.00');
dcl-s time3 time;
dcl-s SecondsDiff int(10);
dcl-s result char(1);
SecondsDiff = %diff(time2: time1: *seconds);
time3 = %time() + %seconds(SecondsDiff);
dsply ('In 35 minutes it will be: ' + %char(time3)) '*EXT' result;
*inlr = *on;
这是一个非常简单的例子,如果你能给我更多关于你想要完成的事情的信息,我可以给出一个更具体的例子。
以下是一个示例程序,可以执行您要求的操作:
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s SecondsChar char(20);
dcl-s Result varchar(32);
dcl-s WaitAnyKey char(1);
dsply 'Enter an amount of seconds: ' '*EXT' SecondsChar;
Result = SecondsToDisplay(%int(SecondsChar));
dsply Result '*EXT' WaitAnyKey;
*inlr = *on;
dcl-proc SecondsToDisplay;
dcl-pi *n varchar(32);
Seconds int(10) value;
end-pi;
dcl-s Result varchar(32) inz('');
dcl-s CurrentValue int(10);
Seconds = %abs(Seconds);
//Get the days
CurrentValue = Seconds / 86400;
if (CurrentValue > 0);
Result = %char(CurrentValue) + 'd ';
Seconds = %rem(Seconds: 86400);
endif;
//Get the hours
CurrentValue = Seconds / 3600;
if (CurrentValue > 0 OR Result <> '');
Result += %char(CurrentValue) + 'h ';
Seconds = %rem(Seconds: 3600);
endif;
//Get the minutes
CurrentValue = Seconds / 60;
if (CurrentValue > 0 OR Result <> '');
Result += %char(CurrentValue) + 'm ';
Seconds = %rem(Seconds: 60);
endif;
//The seconds
Result += %char(Seconds) + 's';
return Result;
end-proc;
一些示例输出:
DSPLY输入秒数:799240
DSPLY 9d 6h 0m 40s