CEECBLDY:将日期转换为 COBOL 整数格式
CEECBLDY 将表示日期的字符串转换为自 1600 年 12 月 31 日以来的天数。 使用 CEECBLDY 访问日期和时间可调用服务的世纪窗口,并使用 COBOL 固有函数执行日期计算。
这项服务与 CEEDAYS 类似,但它提供的是 COBOL 整数格式的字符串,与 COBOL 固有函数兼容。
- input_char_date (输入)
- 半字长度前缀字符串,表示符合 picture_string指定的格式的日期或时间戳记。
字符串必须包含 5 到 255 个字符 (含) 之间的字符。 input_char_date 可以包含前导或尾部空格。 对日期的解析以第一个非空白字符开始 (除非图片字符串本身包含前导空格,在这种情况下, CEECBLDY 在解析开始之前正好跳过那么多位置)。
解析有效日期 (由 picture_string中指定的日期的格式确定) 后, CEECBLDY 将忽略所有剩余字符。 有效日期范围介于并包括 1601 年 1 月 1 日至 9999 年 12 月 31 日。
- picture_string (输入)
- 半字长度前缀字符串,指示 input_char_date中指定的日期的格式。
picture_string 中的每个字符都对应于 input_char_date中的一个字符。 例如,如果指定 MMDDYY 作为 picture_string,那么 CEECBLDY 将读取 input_char_date 060288 作为 1988 年 6 月 02 日。
如果在图片字符串中出现斜杠 (/) 之类的定界符,那么可以省略前导零。 例如,对 CEECBLDY 的以下调用都将相同的值 141502 (1988 年 6 月 02 日) 分配给
COBINTDTE:MOVE '6/2/88' TO DATEVAL-STRING. MOVE 6 TO DATEVAL-LENGTH. MOVE 'MM/DD/YY' TO PICSTR-STRING. MOVE 8 TO PICSTR-LENGTH. CALL CEECBLDY USING DATEVAL, PICSTR, COBINTDTE, FC.MOVE '06/02/88' TO DATEVAL-STRING. MOVE 8 TO DATEVAL-LENGTH. MOVE 'MM/DD/YY' TO PICSTR-STRING. MOVE 8 TO PICSTR-LENGTH. CALL CEECBLDY USING DATEVAL, PICSTR, COBINTDTE, FC.MOVE '060288' TO DATEVAL-STRING. MOVE 6 TO DATEVAL-LENGTH. MOVE 'MMDDYY' TO PICSTR-STRING. MOVE 6 TO PICSTR-LENGTH. CALL CEECBLDY USING DATEVAL, PICSTR, COBINTDTE, FC.MOVE '88154' TO DATEVAL-STRING. MOVE 5 TO DATEVAL-LENGTH. MOVE 'YYDDD' TO PICSTR-STRING. MOVE 5 TO PICSTR-LENGTH. CALL CEECBLDY USING DATEVAL, PICSTR, COBINTDTE, FC.每当 picture_string (例如
HH:MI:SS YY/MM/DD) 中包含诸如冒号或斜杠之类的字符时,它们都将计为占位符,但在其他情况下将被忽略。如果 picture_string 包含日语 Era 符号
<JJJJ>,那么 input_char_date 中的YY位置将替换为日语 Era 中的年号。 例如, 1988 年等于昭和时代的日本第 63 年。 - output_Integer_date (输出)
- 一个 32 位二进制整数,表示 COBOL 整数日期,即自 1600 年 12 月 31 日以来的天数。 例如, 1988 年 5 月 16 日是第 141485 号日。
如果 input_char_date 不包含有效日期,那么 output_Integer_date 将设置为 0 ,并且 CEECBLDY 将终止并带有 non-CEE000 符号反馈代码。
由于 output_Integer_date 是整数,因此可以在 output_Integer_date上轻松执行日期计算。 闰年和年终异常不影响计算。
- fc (输出)
- 指示此服务结果的 12 字节反馈代码 (可选)。
| 符号反馈代码 | 严重性 | 消息号 | 消息文本 |
|---|---|---|---|
| CEE000 | 0 | -- | 服务已成功完成。 |
| CEE2EB | 3 | 2507 | 传递到 CEEDAYS 或 CEESECS 的数据不足。 未计算 Lilian 值。 |
| CEE2EC | 3 | 2508 | 传递给 CEEDAYS 或 CEESECS 的日期值无效。 |
| CEE2ED | 3 | 2509 | 无法识别传递给 CEEDAYS 或 CEESECS 的时代。 |
| CEE2EH | 3 | 2513 | 在 CEEISEC , CEEDAYS 或 CEESECS 调用中传递的输入日期不在受支持的范围内。 |
| CEE2EL | 3 | 2517 | 未识别 CEEISEC 调用中的月份值。 |
| CEE2EM | 3 | 2518 | 在对日期/时间服务的调用中指定了无效的图片字符串。 |
| CEE2EO | 3 | 2520 | CEEDAYS 在数字字段中检测到非数字数据,或者日期字符串与图片字符串不匹配。 |
| CEE2EP | 3 | 2521 | 传给 CEEDAYS 或 CEESECS 的 <JJJJ>、<CCCCC> 或 <CCCCCCCC> 年代内年份值为零。 |
使用说明
- 仅在 COBOL 程序中调用 CEECBLDY,该程序将返回值作为 COBOL 固有函数的输入。 与 CEEDAYS 不同,CEECBLDY 没有反函数,因为它只适用于希望将日期和时间世纪窗口服务与 COBOL 固有函数一起用于日期计算的 COBOL 用户。 CEECBLDY 的逆函数由
DATE-OF-INTEGER和DAY-OF-INTEGER内部函数提供。 - 要对 1601 年 1 月 1 日之前的日期进行计算,请在每个日期的年份后面加上 4000,将日期转换为 COBOL 整数格式,然后进行计算。 如果计算结果是日期 (相对于天数) ,请将结果转换为日期字符串并从年份中减去 4000。
- 缺省情况下,两位数的年份位于系统日期之前 80 年开始的 100 年范围内。 因此,在 2010 年,所有两位数的年份都表示 1930 年到 2029 年之间的日期,包括 1930 年和 2029 年。 您可以使用 CEESCEN 可调用服务来更改此缺省范围。
示例
*************************************************
** **
** Function: Invoke CEECBLDY callable service **
** to convert date to COBOL integer format. **
** This service is used when using the **
** Century Window feature of the date and time **
** callable services mixed with COBOL **
** intrinsic functions. **
** **
*************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. CBLDY.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CHRDATE.
02 Vstring-length PIC S9(4) BINARY.
02 Vstring-text.
03 Vstring-char PIC X
OCCURS 0 TO 256 TIMES
DEPENDING ON Vstring-length
of CHRDATE.
01 PICSTR.
02 Vstring-length PIC S9(4) BINARY.
02 Vstring-text.
03 Vstring-char PIC X
OCCURS 0 TO 256 TIMES
DEPENDING ON Vstring-length
of PICSTR.
01 INTEGER PIC S9(9) BINARY.
01 NEWDATE PIC 9(8).
01 FC.
02 Condition-Token-Value.
COPY CEEIGZCT.
03 Case-1-Condition-ID.
04 Severity PIC S9(4) COMP.
04 Msg-No PIC S9(4) COMP.
03 Case-2-Condition-ID
REDEFINES Case-1-Condition-ID.
04 Class-Code PIC S9(4) COMP.
04 Cause-Code PIC S9(4) COMP.
03 Case-Sev-Ctl PIC X.
03 Facility-ID PIC XXX.
02 I-S-Info PIC S9(9) COMP.
*
PROCEDURE DIVISION.
PARA-CBLDAYS.
*************************************************
** Specify input date and length **
*************************************************
MOVE 25 TO Vstring-length of CHRDATE.
MOVE '1 January 00'
to Vstring-text of CHRDATE.
*************************************************
** Specify a picture string that describes **
** input date, and set the string's length. **
*************************************************
MOVE 23 TO Vstring-length of PICSTR.
MOVE 'ZD Mmmmmmmmmmmmmmz YY'
TO Vstring-text of PICSTR.
*************************************************
** Call CEECBLDY to convert input date to a **
** COBOL integer date **
*************************************************
CALL 'CEECBLDY' USING CHRDATE, PICSTR,
INTEGER, FC.
*************************************************
** If CEECBLDY runs successfully, then compute **
** the date of the 90th day after the **
** input date using Intrinsic Functions **
*************************************************
IF CEE000 of FC THEN
COMPUTE INTEGER = INTEGER + 90
COMPUTE NEWDATE = FUNCTION
DATE-OF-INTEGER (INTEGER)
DISPLAY NEWDATE
' is Lilian day: ' INTEGER
ELSE
DISPLAY 'CEEBLDY failed with msg '
Msg-No of FC UPON CONSOLE
STOP RUN
END-IF.
*
GOBACK.
