史蒂夫·迈尔斯
活跃的成员
已加入:2013年11月30日 帖子:870 地点:宇宙
|
|
|
|
使用SMF日期/时间数据来计算经过时间。
数据
在SMF数据中,日期/时间始终位于8字节的数据区域中,其格式如下
码: |
时间 DAY DS FL4
日期 DS PL4 |
一天中的时间是二进制值,以1/100秒为单位。值60000例如代表1 AM。最大值为8639999:23:59:59.99。
日期中的十进制数字为0cyyddd。 cyy是年份,对于从1900年到1999年的日期,c为0,对于从2000年到2099年的日期为1。至少从概念上讲,该日期和时间是通过像这样的代码在数据中得出的
码: |
TIME BIN
STM 0,1,TIMEOFDAY |
时间宏是标准的MVS宏,可追溯到OS / 360。有很多选择。在OS / 360中,BIN选项指示宏返回二进制形式的一天中的时间。在OS / 360中,返回值的标称精度实际上大于硬件计时工具的精度,并且还有很多其他问题。例如,每天在操作系统中记录该值数千次,并且很容易偏离实际时间。最后一个问题是系统操作员手动输入了初始日期和时间。另一个问题是,日期和时间通常代表当地时间,没有方便且可接受的方法将其转换为某种“通用”时间。
处理此数据有两个主要问题。- 它不是连续的,就像硬件中的时钟一样。必须分别分析日期和时间,并且很难将它们结合起来以计算经过的时间。日期也不是连续的。每年的每年的1月1日重新开始。
- 另一方面,经过时间是连续的,因此实现必须将输入值转换为某种连续值,并且实现必须选择输出精度。
安全时间中的选择是在1/100秒内创建输出,这与输入中一天中的时间精度相同。这个选择并不完美;约248天后,一个32位带符号的数字就会溢出,并且并不能直接显示所有有用的信息。溢出虽然很少见,但却不会闻到。由于数据的某些用途是将值相加,因此相加可能会遇到麻烦。较低的输出精度会减少溢出的机会。例如,一秒的精度会将248天的范围扩展到24800天。
方法
- 同一天
从一天的结束时间减去一天的开始时间
- 多天
- 日期在不同的年份
- 验证结束年份不超过起始年份+1
- 将结束日期“标准化”,以便通过将开始年份中的天数加到结束年份中的一年中的天数来使结束年份与开始年份匹配。
- 通过从8640000中减去第一天的时间来计算第一天的时间
- 对于中间天,每天增加8640000。
- 对于最后一天,将一天中的时间添加到计数中
- 这两个日期是在同一年
在不“标准化”日期的情况下,执行上述相同的计算。
程序
接下来有两个程序。第一个程序是SMFETIME,它是实现第一个计算的程序。第二个程序只是使用SMF类型34记录中的数据来执行SMFETIME。这些记录表示TSO会话。 SMF类型34记录出于说明目的比更常用的类型30记录更简单,这有两个原因。- 不必确定该记录是否针对TSO用户。
- 会话开始时间位于记录的根部分。在类型30记录中,只能通过在记录中找到特定段来确定会话开始时间。
测试程序还显示了如何将经过的时间转换为小时/分钟格式以进行显示。
码: |
安全时间 TITLE' 转换SMF日期/时间数据PA>
IRS TO ELAPSED 时间'
****************************************************** *********************
* *
* Title -- 安全时间 *
* *
*功能/操作-SMFETIME计算经过的时间 *
* 在两个SMF日期/时间对之间。 SMF日期时间对是 *
* 8字节数据区;前4个字节是一天中的二进制时间 *
* 后4个字节是日期(以压缩十进制数字表示) *
* 格式为P'0cyyddd'。 SMFETIME可以处理以下日期 *
* 延长到第二年。 换句话说,开始日期 *
* 可以是2013年,结束日期可以是2014年。 *
* *
* SMFETIME验证输入数据是否有效和合理。 The *
* 前4个字节必须在0到8639999之间(23:59:59.99), and *
* 后4个字节必须用十进制压缩。 *
* *
*通话顺序- *
* 呼叫 安全时间,(start,end,RESULT) (or equivalent) *
* ... *
* start DC F'time-of-day',PL4'0cyyddd' *
* end DC F'time-of-day',PL4'0cyyddd' *
* RESULT DC F'elapsed-time' *
* *
*属性-SMFETIME是可重新输入,可刷新和可重用的。 *
* 它可以在与以下设备兼容的任何AMODE和RMODE中运行 *
* 呼叫者,召集者;它被声明为AMODE 31,RMODE ANY。 The result *
* 以1/100秒为单位。 该progran在 *
* TCB模式,问题状态和问题密钥。 Since it uses no *
* 外部资源,其APF状态未定义。 *
* *
*注册15个返回码- *
* 0-结果区域包含经过的时间。 *
* 4-输入数据无效。 *
* -日期区域未包装十进制。 *
* -一天中的时间值不在0至的范围内 *
* 8639999. *
* 结果溢出了32位寄存器的容量。 *
* (248+ days). *
* *
*限制-SMFETIME使用TP指令测试日期 *
* areas. 如果该指令不可用,SMFETIME将失败 *
* 带有S0C1 ABEND;如果汇编器不支持 *
* 指示程序集将失败。 使用 *
* 提供了TRT指令以及两个翻译和测试表,分别为 *
* comments. 此代码尚未经过测试。 *
* *
* SMFETIME要求z / Architecture级别设置为1。 This level set *
* 不提供TP指令。 *
* *
****************************************************** *********************
SPACE 5
安全时间段 DEFINE PROGRAM 中科院
安全时间 AMODE 31 定义程序模式
安全时间 RMODE ANY DEFINE PROGRAM RMODE
办公区 定义工作区
ORG WORKAREA+72-8 RESET POSITION TO THE 保存 AREA ->
REGISTER 11 AREA
作品 DS D 定义一个双字工作区
安全时间段 返回计划部分
USING *,10 建立计划的能力
USING WORKAREA,13 建立工作区的能力
SAVE (14,10),,'SMFETIME &SYSDATE &SYSTIME' 保存 REGISTERS
LR 10,15 复印输入点地址至第10条
LM 2,4,0(1) 加载参数列表
* TRT 4(3,2),TRTTAB1 VERIFY
* JNZ EXIT4 THE
* TRT 4(3,3),TRTTAB1 日期
* JNZ EXIT4 AREAS
* TRT 7(1,2),TRTTAB2 CONTAIN
* JNZ EXIT4 PACKED
* TRT 7(1,3),TRTTAB2 DECIMAL
* JNZ EXIT4 DATA
TP 4(4,2) TEST START 日期
JNZ EXIT4 BR如果未打包十进制
TP 4(4,3) TEST 结束 日期
JNZ EXIT4 BR如果未打包十进制
ICM 0,B'1111',0(2) 每天的加载开始时间
JM 出口4 BR IF BAD
ICM 1,B'1111',0(3) 加载结束时间
JM 出口4 BR IF BAD
C 0,=A(100*24*60*60-1) 每天的测试开始时间
JH 出口4 BR IF TOO HIGH
C 1,=A(100*24*60*60-1)一天的测试结束时间
JH 出口4 BR IF TOO HIGH
CP 4(4,2),4(4,3) 如果开始日期=结束日期则进行测试
JNE MDAYS BR IF NOT
SR 1,0 COMPUTE ELAPSED 时间
ST 1,0(,4) STORE ELAPSED 时间
JM 出口4 BR IF BAD
J EXIT0 EXIT WITH A SMILE
MDAYS ZAP DWORK,4(4,2) CONVERT START 日期
CVB 7,DWORK TO BINARY
ZAP DWORK,4(4,3) CONVERT 结束 日期
CVB 9,DWORK TO BINARY
SR 6,6 SEPARATE
SR 8,8 CYY
D 6,=F'1000' AND
D 8,=F'1000' DDD
* REG目录
* 6 开学日期的第几天
* 7 开学年度
* 8 截止日期的一天
* 9 CYY OF 结束ING YEAR
LR 1,9 将第CYY复制结束
SR 1,7 从START CYY减去END CYY
JZ SAMEYEAR BR IF 结束 CYY = START CYY
JM 出口4 BR IF 结束 CYY < START CYY
CHI 1,1 TEST IF 结束 CYY = START CYY + 1
JNE EXIT4 BR IF NOT
LR 1,7 COPY START CYY TO REG 1
AHI 1,1900 将开始CYY转换为真实年份
LR 14,1 从年份开始到REG 14
N 14,=A(B'11') 如果可能的话,请进行测试
JNZ NOTLEAP BR如果不是很轻松的一年
LR 15,1 从年份开始到REG 15
D 14,=F'100' 将开年除以100
LTR 14,14 TEST THE REMAINDER
JNZ ISLEAP BR如果年份不算是一个世纪 ->
YEAR
N 15,=A(B'11') 如果开始是一个世纪,请进行测试 ->
LEAP YEAR
JZ 伊斯拉 BR IF SO
跳跳 LHI 0,365 SET REG 0 =正常年份的天数
J ADJUST
伊斯拉 LHI 0,366 SET REG 0 =短短的几天
调整 AR 8,0 UPDATE 结束 DDD
*现在计算所需时间
*计算时间在第一天
萨米尔·L 0,=A(100*24*60*60) 每天加载午夜时间
S 0,0(,2) 减去开始时间
明天 AHI 6,1 在一年中的第一天添加1
CR 6,8 比较年度结束日期
JE 最后一天 BR IF LAST DAY
A 0,=A(100*24*60*60) 在1整天增加时间
JO 出口4 BR IF OVERFLOW
J NEXTDAY AND DO IT AGAIN
最后一天 A 0,0(,3) ADD 时间 IN THIS DAY
JO 出口4 BR IF MATH OVERFLOW
ST 0,0(,4) STORE 结果
出口0 SR 15,15 SET RC = 0
J EXIT
出口4 LHI 15,4 SET RC = 4
出口 RETURN (14,10),T,RC=(15) 恢复寄存器& RETURN
DC 0D'0'
*使用TRTTAB1验证前3个字节,并使用TRTTAB2验证
*打包的十进制数据的第4个字节。
** 0 1 2 3 4 5 6 7 8 9 A B C D E F
* TRTTAB1 DC 10X'00000000000000000000040404040404'
* DC 6X'04040404040404040040404040404040404'
* TRTTAB2 DC 10X'00000000000000000000000000000000'
* DC 6X'04040404040404040040404040404040404'
LTORG , DEFINE THE 安全时间 LITERALS
DC 0D'0' ROUND 中科院 TO 8 BYTES
END , |
码: |
*使用真实SMF数据进行测试。 THE OUTPUT LINE IS
* (1) (2) (3) (4) (5) (6) (7)
* UUUUUUUU DDDDDDDDD HHH:MM DDDDDDD YYYY / DDD DDDDDDD YYYY / DDD
* (1)UUUUUUUU是一个用户名
* (2) DDDDDDDDD IS THE "RAW"SMFETIME的经过时间(显示为A)
* 9位数字
* (3) HHH:MM是SMFETIME的经过时间。 HHH代表小时
* MM代表分钟
* (4)DDDDDDD是一天的开始时间,以秒为单位的1/100
* (5)CYY / DDD是开始日期
* (6)DDDDDDD是一天的结束时间
* (7) YYYY / DDD IS THE 结束 日期
SPACE 1
*该计划的主要目的是演示使用
* 安全时间;不要进行现实的SMF记录分析。 THE SMF 34 RECORD
*自记录日期/时间以来,此目的很方便
*并且会议开始日期/时间在记录的根目录中,
*在30型记录中比粪便响得多。
SPACE 1
*从1/100分之一的值转换为H:MM VALUE IS AN
*自定义数据转换为辅助报告的可读性。
SPACE 1
驱动器 CSECT ESTABLISH PROGRAM 中科院
PUSH 打印
PRINT NOGEN
SMFREC DSECT 为SMF数据定义DSECT
IFASMFR 34 为SMF 34记录定义DSECT
POP PRINT
驱动器 CSECT RETURN TO PROGRAM 中科院
USING *,12 建立计划的能力
SAVE (14,12),,* 保存 呼叫ER'S REGISTERS
LR 12,15 复印输入点地址至第12条
LA 15,SAVEAREA LOAD ADDRESS OF THE NEW 保存 AREA
ST 13,4(,15) ADD NEW 保存 AREA TO THE
ST 15,8(,13) 保存 AREA CHAIN
LR 13,15 ESTABLISH A NEW 保存 AREA POINTER
OPEN MF=(E,OPARM) 打开 THE DATA SETS
循环 GET SMFDCB READ A RECORD
LR 2,1 将修订地址复制到REG 2
USING SMFREC,2 建立SMF记录可寻址性
CLI TIVRCDTY,34 测试TYPE 34记录
JNE LOOP BR如果没有
L 15,=V(SMFETIME) LOAD ADDRESS OF 安全时间
CALL (15),(TIVONTME,TIVRCDTS),MF=(E,CALLPARM) COMPUTE THE ->
会议所需时间
MVC STIME,EDMASK3 COPY
MVC ETIME,EDMASK3 EDIT
MVC SDATE,EDMASK4 MASKS
MVC EDATE,EDMASK4 TO THE OUTPUT LINE
ED SDATE,TIVONTME+4 转换登录并注销日期
ED EDATE,TIVRCDTS+4 CYY/DDD
ICM 0,B'1111',TIVONTME 加载登录时间
CVD 0,16(,13) 将登录时间转换为十进制
ED 时光,16+4(13) AND DECIMAL DIGITS
ICM 0,B'1111',TIVRCDTS 加载注销时间
CVD 0,16(,13) 将注销时间转换为打包时间
ED 时代,16+4(13) 十进制和十进制数字
L 1,RESULT LOAD THE 结果
*将耗时转换为HHH.MM(HOURS/MINUTES)
SR 0,0 SET REG 0 = 0
D 0,=A(100*60*60) 用时间除以数字 ->
一小时内的1/100秒 ->
寄存器1包含数字 ->
小时和登记2的内容 ->
分钟数和 ->
会议第二
MHI 1,100 乘以100
LR 3,1 COPY HOURS TO REG 3
LR 1,0 复印时间和秒数,到第1条
SR 0,0 SET REG 0 = 0
D 0,=A(100*60) 除以分钟和秒 ->
十分之一的秒数 ->
MINUTE
AR 3,1 将分钟数增加。 WE NOW HAVE ->
复合值HHMM
CVD 3,16(,13) 将HHMM转换为十进制
MVC ETIME1,EDMASK1 将编辑掩码复制到工作区域
ED 时间1,16+5(13) 将HHMM转换为HH.MM格式
L 0,RESULT LOAD THE 生的 ELAPSED 时间
CVD 0,16(,13) CONVERT TO DECIMAL
MVC ETIME2,EDMASK2 在输出线上复制编辑标签
ED 时间2,16+3(13) 将所需的时间转换为数字
MVC OUTUSER,TIVUIF 将用户名复制到行中
PUT PRINT,OUTLINE 写出完整的输出线
J LOOP DO IT AGAIN
紧急行动 CLOSE MF=(E,CPARM) CLOSE THE DATA SETS
L 13,4(,13) LOAD ADDRESS OF THE HIGHER 保存 AREA
RETURN (14,12),T,RC=0 RESTORE REGISTERS & RETURN
保存AREA DC 9D'0' 72 BYTE OS/260 保存 AREA
PUSH 打印
PRINT NOGEN
OPARM 打开 (打印,输出,SMFDCB,输入),MF=L 打开 PARM LIST
CPARM CLOSE (PRINT,,SMFDCB),MF=L CLOSE PARM LIST
打印 DCB DSORG = PS,MACRF = PM,DDNAME = SYSPRINT,RECFM = VBA,LRECL = 125
SMFDCB DCB DSORG = PS,MACRF = GL,DDNAME = SMF,BFTEK = A,EODAD = 紧急行动
POP PRINT
*参数列表发送到SMTIME。 前两个参数指针
*指向登录和注销日期/时间,并填写在
* "EXECUTE"呼叫宏的表格,用于指定此参数列表。
呼叫PARM 呼叫 ,(*-*,*-*,RESULT),MF=L
结果 DC F'0' SMFETIME计算的经过时间
* 编辑 MASKS
EDMASK1 DC 0C'HHH.MM',C'',X'202120',C'。',X'2020'
EDMASK2 DC 0C'DDDDDDDDD',C'',7X'20',X'2120'
EDMASK3 DC 0C'DDDDDDD',C'',5X'20',X'2120'
EDMASK4 DC 0C' CYY / DDD',C'',X'20202120',C'/',X'202020'
*输出线构建区域
大纲 DC AL2(OUTLINEL,0),C' '
OUTUSER DC CL8' '
时间2 DC C' DDDDDDDDD'
时间1 DC C' HHH.MM'
时光 DC C' DDDDDDD'
SDATE DC C' YYYY / DDD'
时代 DC C' DDDDDDD'
EDATE DC C' YYYY / DDD'
大纲L EQU *-OUTLINE
DC 0D'0'
LTORG ,
DC 0D'0'
END DRIVER |
|
|