CEEDAYS は、日付を表すストリングをリリアン形式に変換します。リリアン形式では、日付をグレゴリオ暦の始めからの日数で表します。 CEEDAYS は、指定された input_char_date を、リリアン形 式における第 1 日目 (1582 年 10 月 14 日金曜日) からの日数を表す数に変 換します。
CEEDAYS の逆は CEEDATE であり、output_Lilian_date をリリアン形式から 文字形式に変換します。
プログラムが INTDATE(LILIAN) コンパイラー・オプションでコンパイルされ ていない場合は、CEEDAYS を COBOL の組み込み関数と組み合わせて使用しないでください。組み込み関数を使用し、また INTDATE(ANSI) でコンパイルされている COBOL プログラムには CEECBLDY を使用してください。
1601 年以前の日付を処理するためには、各年に 4000 を追加し、リリアン形 式に変換して計算を行い、結果から 4000 を減算し、変換して文字形式に戻してください。
構文 >>-CEEDAYS--(--input_char_date--,--picture_string--,------------> >--output_Lilian_date--,--fc--)--------------------------------><
文字数は 5 から 255 までとします (5 と 255 を含む)。input_char_date には、先行ブランクまたは後書きブランクを入れることができます。日付の構文解析は、最初の非ブランク文字から始まります。(ただし、ピクチャー・ストリングそのものに先行ブランクがある場合を除きます。この場合には、構文解析を開始する前に、CEEDAYS はこのブランク分だけスキップします。)
有効な日付を picture_string で指定した日付の形式に従って 構文解析した後で、CEEDAYS は残りのすべての文字を無視します。有効な日付の範囲は、1582 年 10 月 15 日から 9999 年 12 月 31 日までです。input_char_date に指定できる有効な ピクチャー文字用語については、表 1 を参照してください。
picture_string 内の各文字は、input_char_date 内の文字に対応します。例えば、MMDDYY を picture_string として指定する場合には、CEEDAYS は input_char_date の 060288 を 1988 年 6 月 2 日として読み取ります。
ピクチャー・ストリングにスラッシュ (/) などの区切り文字がある場合には、先行 ゼロを省略することができます。例えば、CEEDAYS に対する以下の呼び出しは、それぞれ lildate に同じ値の 148155 (1988 年 6 月 2 日) を割り当てます。
CALL CEEDAYS('6/2/88' , 'MM/DD/YY', lildate, fc);
CALL CEEDAYS('06/02/88', 'MM/DD/YY', lildate, fc);
CALL CEEDAYS('060288' , 'MMDDYY' , lildate, fc);
CALL CEEDAYS('88154' , 'YYDDD' , lildate, fc);
CALL CEEDAYS('1988154' , 'YYYYDDD' , lildate, fc);
picture_string (HH:MI:SS YY/MM/DD など) にコロンまたはスラッシュなどの文字がある場合、それらの文字はプレー スホルダーとして扱われるか、無視されます。有効なピクチャー文字用語のリストについては 表 1 を、また有効なピクチャー・ストリングの例については 表 2 を参照してください。
picture_string に日本元号 <JJJJ> が入っている場 合には、input_char_date における YY の位置が日本元号 の年に置き換えられます。 例えば、1988 年は日本の昭和 63 年と同じです。表 2 の例も参照してください。 CEEDATE でサポートされている日本の年号のリストについては、表 3 を参照してください。
picture_string に元号記号 <CCCC> または <CCCCCCCC> が含まれている場合、input_char_date の YY の位置は、その元号年に置き換えられます。 表 2 の例も参照してください。
input_char_date に有効な日付が入っていない場合には、output_Lilian_date を 0 に設定し、CEEDAYS は CEE000 以外の 記号フィードバック・コードで終了します。
日付の計算は、整数であるため、output_Lilian_date で容易に実行することができます。うるう年および年の終わりの変則性は計算に影響を及ぼしません。
このサービスの結果、出力される記号条件は以下のとおりです。
コード | 重大度 | メッセージ番号 | メッセージ・テキスト |
---|---|---|---|
CEE000 | 0 | — | サービスが正しく完了した。 |
CEE2EB | 3 | 2507 | 不十分なデータが CEEDAYS または CEESECS に渡された。リリアン日付の値が計 算されなかった。 |
CEE2EC | 3 | 2508 | CEEDAYS または CEESECS に渡された日付の値が無効であった。 |
CEE2ED | 3 | 2509 | CEEDAYS または CEESECS に渡された年号が認識されなかった。 |
CEE2EH | 3 | 2513 | 入力された日付がサポートの範囲外だった。 |
CEE2EL | 3 | 2517 | 月の値が認識されなかった。 |
CEE2EM | 3 | 2518 | 正しくないピクチャー・ストリングが指定された。 |
CEE2EO | 3 | 2520 | CEEDAYS が数字フィールドで非数字データを検出したか、日付ストリングがピクチャー・ストリングに適合しなかった。 |
CEE2EP | 3 | 2521 | CEEDAYS または CEESECS に渡された年号の年が 0 であった。 |
/*Module/File Name: EDCDAYS */
#include <leawi.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ceeedcct.h>
int main(void) {
_FEEDBACK fc;
_INT4 lil_date1,lil_date2;
_VSTRING date,date_pic;
/* use CEEDAYS to get the Lilian format */
strcpy(date.string,"05/14/64");
date.length = strlen(date.string);
strcpy(date_pic.string,"MM/DD/YY");
date_pic.length = strlen(date_pic.string);
CEEDAYS(&date,&date_pic,&lil_date1,&fc);
if ( _FBCHECK ( fc , CEE000 ) != 0 ) {
printf("CEEDAYS failed with message number %d¥n",
fc.tok_msgno);
exit(2999);
}
/* use CEEDAYS to get the Lilian format */
strcpy(date.string,"August 14, 1966");
date.length = strlen(date.string);
strcpy(date_pic.string,"Mmmmmmmmmmmz DD, YYYY");
date_pic.length = strlen(date_pic.string);
CEEDAYS(&date,&date_pic,&lil_date2,&fc);
if ( _FBCHECK ( fc , CEE000 ) != 0 ) {
printf("CEEDAYS failed with message number %d¥n",
fc.tok_msgno);
exit(2999);
}
/* subtract the two Lilian dates to find out */
/* difference in days */
printf("The number of days between"
" May 14, 1964 and August 14, 1966"
" is: %d¥n",lil_date2 - lil_date1);
}
CBL LIB,QUOTE
*Module/File Name: IGZTDAYS
*******************************************
** **
** 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) BINARY.
04 Msg-No PIC S9(4) BINARY.
03 Case-2-Condition-ID
REDEFINES Case-1-Condition-ID.
04 Class-Code PIC S9(4) BINARY.
04 Cause-Code PIC S9(4) BINARY.
03 Case-Sev-Ctl PIC X.
03 Facility-ID PIC XXX.
02 I-S-Info PIC S9(9) BINARY.
PROCEDURE DIVISION.
PARA-CBLDAYS.
*************************************************
** Specify input date and length **
*************************************************
MOVE 16 TO Vstring-length of CHRDATE.
MOVE "1 January 2000"
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.
*PROCESS MACRO;
/*Module/File Name: IBMDAYS */
/***************************************************/
/** **/
/** Function : CEEDAYS - Convert date to **/
/** Lilian format **/
/** **/
/** This example converts two dates to the Lilian **/
/** format in order to calculate the number of **/
/** days between them. **/
/** **/
/***************************************************/
PLIDAYS: PROC OPTIONS(MAIN);
%INCLUDE CEEIBMAW;
%INCLUDE CEEIBMCT;
DCL CHRDATE CHAR(255) VARYING;
DCL CHRD2 CHAR(255) VARYING;
DCL PICSTR CHAR(255) VARYING;
DCL PICST2 CHAR(255) VARYING;
DCL LILIAN REAL FIXED BINARY(31,0);
DCL LIL2 REAL FIXED BINARY(31,0);
DCL 01 FC, /* Feedback token */
03 MsgSev REAL FIXED BINARY(15,0),
03 MsgNo REAL FIXED BINARY(15,0),
03 Flags,
05 Case BIT(2),
05 Severity BIT(3),
05 Control BIT(3),
03 FacID CHAR(3), /* Facility ID */
03 ISI /* Instance-Specific Information */
REAL FIXED BINARY(31,0);
/* First date to be converted to Lilian format */
CHRDATE = '5/7/69';
/* Picture string of first input date */
PICSTR = 'ZM/ZD/YY';
/* Call CEEDAYS to convert input date to the */
/* Lilian format */
CALL CEEDAYS ( CHRDATE , PICSTR , LILIAN , FC );
IF FBCHECK( FC, CEE000) THEN DO;
PUT SKIP LIST( 'The Lilian date for ' || CHRDATE
|| ' is ' || LILIAN );
END;
ELSE DO;
DISPLAY( 'CEEDAYS failed with msg '
|| FC.MsgNo );
STOP;
END;
/* Second date to be converted to Lilian format */
CHRD2 = '1 January 2000';
/* Picture string of second input date */
PICST2 = 'ZD Mmmmmmmmmmmmmmz YYYY';
/* Call CEEDAYS to convert input date to the */
/* Lilian format */
CALL CEEDAYS ( CHRD2 , PICST2 , LIL2 , FC );
IF FBCHECK( FC, CEE000) THEN DO;
PUT SKIP LIST( 'The Lilian date for ' || CHRD2
|| ' is ' || LIL2 );
END;
ELSE DO;
DISPLAY( 'CEEDAYS failed with msg '
|| FC.MsgNo );
STOP;
END;
/* Subtract the two Lilian dates to find out */
/* the difference in days between the two */
/* input dates */
PUT SKIP LIST( 'The number of days between '
|| CHRDATE || ' and ' || CHRD2 || ' is'
|| LIL2 - LILIAN || '.');
END PLIDAYS;