如何在COBOL85 Tandem中计算自定义时间戳?
在COBOL85 Tandem中计算自定义日期时间的时间戳
针对自定义日期时间(示例:23/09/2022 4:30:45)计算时间戳,Tandem COBOL85提供了内置函数简化操作,以下是具体实现步骤和代码示例:
核心思路
时间戳通常定义为从1970-01-01 00:00:00(Unix纪元)到目标时间的总秒数。Tandem COBOL85的FUNCTION DATETIME-DIFFERENCE可以直接计算两个日期时间的秒数差,无需手动处理闰年、月份天数等复杂逻辑。
实现步骤
- 定义输入日期时间变量,以及纪元基准时间变量
- 将输入的
DD/MM/YYYY HH:MM:SS格式转换为结构化的年、月、日、时、分、秒变量 - 调用内置函数计算时间差,得到时间戳
- 可选:添加日期时间合法性校验,避免无效输入
代码示例
IDENTIFICATION DIVISION. PROGRAM-ID. CALC-TIMESTAMP. WORKING-STORAGE SECTION. *> 输入的原始日期时间(DD/MM/YYYY 和 HH:MM:SS) 01 INPUT-DATA. 05 INPUT-DATE PIC X(10) VALUE "23/09/2022". 05 INPUT-TIME PIC X(8) VALUE "04:30:45". *> 转换后的结构化日期时间(用于函数计算) 01 CONVERTED-DT. 05 CDT-YEAR PIC 9(4). 05 CDT-MONTH PIC 9(2). 05 CDT-DAY PIC 9(2). 05 CDT-HOUR PIC 9(2). 05 CDT-MINUTE PIC 9(2). 05 CDT-SECOND PIC 9(2). *> Unix纪元基准时间(1970-01-01 00:00:00) 01 EPOCH-DT. 05 ED-YEAR PIC 9(4) VALUE 1970. 05 ED-MONTH PIC 9(2) VALUE 01. 05 ED-DAY PIC 9(2) VALUE 01. 05 ED-HOUR PIC 9(2) VALUE 00. 05 ED-MINUTE PIC 9(2) VALUE 00. 05 ED-SECOND PIC 9(2) VALUE 00. *> 存储最终时间戳(秒级,支持到2038年后的范围) 01 TIMESTAMP PIC S9(10) COMP-5. PROCEDURE DIVISION. *> 1. 拆分输入日期为年、月、日 UNSTRING INPUT-DATE DELIMITED BY "/" INTO CDT-DAY CDT-MONTH CDT-YEAR. *> 2. 拆分输入时间为时、分、秒 UNSTRING INPUT-TIME DELIMITED BY ":" INTO CDT-HOUR CDT-MINUTE CDT-SECOND. *> 3. 可选:输入合法性校验(示例:月份范围检查) IF CDT-MONTH < 1 OR CDT-MONTH > 12 DISPLAY "ERROR: 无效月份 - " CDT-MONTH STOP RUN. *> 4. 计算纪元到目标时间的秒数差,得到时间戳 COMPUTE TIMESTAMP = FUNCTION DATETIME-DIFFERENCE (ED-YEAR, ED-MONTH, ED-DAY, ED-HOUR, ED-MINUTE, ED-SECOND, CDT-YEAR, CDT-MONTH, CDT-DAY, CDT-HOUR, CDT-MINUTE, CDT-SECOND). *> 输出结果 DISPLAY "输入时间:" INPUT-DATE " " INPUT-TIME DISPLAY "对应的Unix时间戳(秒):" TIMESTAMP. STOP RUN.
关键说明
FUNCTION DATETIME-DIFFERENCE是Tandem COBOL85的扩展内置函数,参数顺序为:基准时间的年、月、日、时、分、秒,接着是目标时间的年、月、日、时、分、秒,返回值为两者的秒数差(目标时间晚于基准时为正数)。- 如果需要毫秒级时间戳,可以在计算后补充处理(比如乘以1000,若输入包含毫秒的话)。
- 日期校验逻辑可根据需求扩展,比如判断每月的最大天数、闰年处理等,避免非法输入导致计算错误。
内容的提问来源于stack exchange,提问作者Pratiksha
相关产品推荐
相关产品推荐

