CEEDAYS: 将日期转换为 Lilian 格式
CEEDAYS 将表示日期的字符串转换为 Lilian 格式,该格式表示从公历 (1582 年 10 月 14 日星期五) 开始的天数。
请勿将 CEEDAYS 与 COBOL 固有函数结合使用。 将 CEECBLDY 用于使用内部函数的程序。
- input_char_date (输入)
- 半字长度前缀字符串,表示符合 picture_string指定的格式的日期或时间戳记。
字符串必须包含 5 到 255 个字符 (含) 之间的字符。 input_char_date 可以包含前导或尾部空格。 对日期的解析以第一个非空白字符开始 (除非图片字符串本身包含前导空格,在这种情况下, CEEDAYS 在解析开始之前正好跳过那么多位置)。
解析有效日期 (由 picture_string中指定的日期的格式确定) 后, CEEDAYS 将忽略所有剩余字符。 有效日期范围为 1582 年 10 月 15 日至 9999 年 12 月 31 日。
- picture_string (输入)
- 半字长度前缀字符串,指示 input_char_date中指定的日期的格式。
picture_string 中的每个字符都对应于 input_char_date中的一个字符。 例如,如果将 MMDDYY 指定为 picture_string,那么 CEEDAYS 将读取 input_char_date 060288 作为 1988 年 6 月 2 日。
如果在图片字符串中出现斜杠 (/) 之类的定界符,那么可以省略前导零。 例如,对 CEEDAYS 的以下调用都将相同的值 148155 (1988 年 6 月 02 日) 分配给 lildate:
CALL CEEDAYS USING '6/2/88' , 'MM/DD/YY', lildate, fc. CALL CEEDAYS USING '06/02/88', 'MM/DD/YY', lildate, fc. CALL CEEDAYS USING '060288' , 'MMDDYY' , lildate, fc. CALL CEEDAYS USING '88154' , 'YYDDD' , lildate, fc.每当 picture_string (例如
HH:MI:SS YY/MM/DD) 中包含诸如冒号或斜杠之类的字符时,它们都将计为占位符,但在其他情况下将被忽略。如果 picture_string 包含日语 Era 符号
<JJJJ>,那么 input_char_date 中的YY位置将替换为日语 Era 中的年号。 例如, 1988 年等于昭和时代的日本第 63 年。 - output_Lilian_date (输出)
- 32 位二进制整数,表示 Lilian 日期,即自 1582 年 10 月 14 日以来的天数。 例如, 1988 年 5 月 16 日是第 148138 号日。
如果 input_char_date 不包含有效日期,那么 output_Lilian_date 将设置为 0 ,并且 CEEDAYS 将终止并返回 non-CEE000 符号反馈代码。
日期计算是在 output_Lilian_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> 年代内年份值为零。 |
使用说明
- CEEDAYS 的逆函数是 CEEDATE ,它将 output_Lilian_date 从 Lilian 格式转换为字符格式。
- 要对早于 1582 年 10 月 15 日的日期执行计算,请将每个日期中的年份添加 4000 ,将日期转换为 Lilian ,然后执行计算。 如果计算结果是日期 (相对于天数) ,请将结果转换为日期字符串并从年份中减去 4000。
- 缺省情况下,两位数的年份位于系统日期之前 80 年开始的 100 年范围内。 因此,在 2010 年,所有两位数的年份都表示 1930 年到 2029 年之间的日期,包括 1930 年和 2029 年。 您可以使用可调用服务 CEESCEN 来更改缺省范围。
- 您可以轻松地对 output_Lilian_date执行日期计算,因为它是整数。 避免跨年和年终异常。
示例
*******************************************
** **
** Function: CEEDAYS - convert date to **
** Lilian format **
** **
*******************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. CBLDAYS.
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 LILIAN PIC S9(9) BINARY.
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 16 TO Vstring-length of CHRDATE.
MOVE '1 January 2005'
TO Vstring-text of CHRDATE.
*************************************************
** Specify a picture string that describes **
** input date, and the picture string's length.**
*************************************************
MOVE 25 TO Vstring-length of PICSTR.
MOVE 'ZD Mmmmmmmmmmmmmmz YYYY'
TO Vstring-text of PICSTR.
*************************************************
** Call CEEDAYS to convert input date to a **
** Lilian date **
*************************************************
CALL 'CEEDAYS' USING CHRDATE, PICSTR,
LILIAN, FC.
*************************************************
** If CEEDAYS runs successfully, display result**
*************************************************
IF CEE000 of FC THEN
DISPLAY Vstring-text of CHRDATE
' is Lilian day: ' LILIAN
ELSE
DISPLAY 'CEEDAYS failed with msg '
Msg-No of FC UPON CONSOLE
STOP RUN
END-IF.
GOBACK.
