CEESECS は、タイム・スタンプを表すストリングをリリアン秒数に変換します (1582 年 10 月 14 日 00:00:00 以降の秒数)。 このサービスによって、2 つのタイム・スタンプ間で経過した時間を計算するなどの時間演算が簡単になります。
CEESECS は、CEESETL 呼び出し可能サービスと setlocale() 関数からの影響は受けません。COUNTRY ランタイム・オプションまたは CEE3CTY 呼び出し可能 サービスの国別コード設定値によってのみ影響を受けます。
構文 >>-CEESECS--(--input_timestamp--,--picture_string--,------------> >--output_seconds--,--fc--)------------------------------------><
有効な日付を picture_string で指定される日付の形式に従って解析したあと CEESECS は残りのすべての文字を無視します。有効な日付の範囲は、1582 年の 10 月 15 日から 9999 年の 12 月 31 日までです (1582 年 10 月 15 日と 9999 年 12 月 31 日を含む)。完全な日付を指定する必要があります。有効な時間の範囲は、00:00:00.000 から 23:59:59.999 までです。
1992-05-17-19:02 is equivalent to 1992-05-17-19:02:00
1992-05-17 is equivalent to 1992-05-17-00:00:00
CALL CEESECS('92/06/03 15.35.03', 'YY/MM/DD
HH.MI.SS', secs, fc);
CALL CEESECS('92/6/3 15.35.03' , 'YY/MM/DD
HH.MI.SS', secs, fc);
CALL CEESECS('92/6/3 3.35.03 PM', 'YY/MM/DD
HH.MI.SS AP', secs, fc);
CALL CEESECS('92.155 3.35.03 pm', 'YY.DDD
HH.MI.SS AP', secs, fc);
ピクチャー・ストリングが NULL またはブランクのままである場合には、CEESECS が COUNTRY ランタイム・オプションの現行値に基づく picture_string を取得します。 例えば、COUNTRY ランタイム・オプションの現行値が FR (フランス) である場合 、日付形式は、DD.MM.YYYY になります。
picture_string に日本元号の記号 <JJJJ> が入っている場合、input_timestamp 内の YY の位置は日本元号内での年数を表します。 例えば、1988 年は日本の昭和 63 年と同じです。CEESECS でサポートされている日本の年号のリストについては、表 3 を参照してください。
picture_string に元号記号 <CCCC> または <CCCCCCCC> が含まれる場合、input_timestamp 内の YY の位置は、その元号内での年数を表します。
有効なピクチャー文字のリストについては 表 1 を、また有効なピクチャー・ストリングの例については 表 2 を参照してください。
表示可能な最大値は 9999 年 12 月 31 日 23:59:59.999 で、リリアン形式では 265,621,679,999.999 秒です。
64 ビットの倍精度浮動小数点の値は、精度を失うことなくおよそ 16 桁の 10 進 有効数字を正確に表すことができます。したがって、正確度はミリ秒単位です (10 進数で 15 桁)。
input_timestamp に有効な日付またはタイム・スタンプが入って いない場合には、output_seconds が 0 に設定され、CEESECS は CEE000 以外の記号フィードバック・コードで終了します。
経過時間の計算は、output_seconds (これは、経過した時間を表すため) で容易に実行することができます。うるう年および年の終わりの変則性は計算に影響を及ぼしません。
このサービスの結果、出力される記号条件は以下のとおりです。
コード | 重大度 | メッセージ番号 | メッセージ・テキスト |
---|---|---|---|
CEE000 | 0 | — | サービスが正しく完了した。 |
CEE2EB | 3 | 2507 | 不十分なデータが CEEDAYS または CEESECS に渡された。リリアン日付の値が計 算されなかった。 |
CEE2EC | 3 | 2508 | CEEDAYS または CEESECS に渡された日付の値が無効であった。 |
CEE2ED | 3 | 2509 | CEEDAYS または CEESECS に渡された年号が認識されなかった。 |
CEE2EE | 3 | 2510 | CEEISEC 呼び出しまたは CEESECS 呼び出しの時間値が認識されなかった。 |
CEE2EH | 3 | 2513 | CEEISEC、CEEDAYS、または CEESECS 呼び出しに渡された入力の日付が、サ ポート範囲内になかった。 |
CEE2EK | 3 | 2516 | CEEISEC 呼び出しの分の値が認識されなかった。 |
CEE2EL | 3 | 2517 | CEEISEC 呼び出しの月の値が認識されなかった。 |
CEE2EM | 3 | 2518 | 日時サービスの呼び出しで無効なピクチャー・ストリングが指定された。 |
CEE2EN | 3 | 2519 | CEEISEC 呼び出しの秒の値が認識されなかった。 |
CEE2EP | 3 | 2521 | CEEDAYS または CEESECS に渡された年号の年が 0 であった。 |
CEE2ET | 3 | 2525 | CEESECS が英数字フィールドで非英数字データを検出したか、タイム・スタンプ・ストリングがピクチャー・ストリングに一致しなかった。 |
/*Module/File Name: EDCSECS */
#include <stdio.h>
#include <string.h>
#include <leawi.h>
#include <stdlib.h>
#include <ceeedcct.h>
int main(void) {
_FEEDBACK fc;
_FLOAT8 seconds1, seconds2;
_VSTRING date,date_pic;
/* use CEESECS to convert to seconds timestamp */
strcpy(date.string,"09/13/91 23:23:23");
date.length = strlen(date.string);
strcpy(date_pic.string,"MM/DD/YY HH:MI:SS");
date_pic.length = strlen(date_pic.string);
CEESECS(&date,&date_pic,&seconds1,&fc);
if ( _FBCHECK ( fc , CEE000 ) != 0 ) {
printf("CEESECS failed with message number %d¥n",
fc.tok_msgno);
exit(2999);
}
strcpy(date.string,
"December 15, 1992 at 8:23:45 AM");
date.length = strlen(date.string);
strcpy(date_pic.string,
"Mmmmmmmmmmmz DD, YYYY at ZH:MI:SS AP");
date_pic.length = strlen(date_pic.string);
CEESECS(&date,&date_pic,&seconds2,&fc);
if ( _FBCHECK ( fc , CEE000 ) != 0 ) {
printf("CEESECS failed with message number %d¥n",
fc.tok_msgno);
exit(2999);
}
printf("The number of seconds between:¥n");
printf(" September 13, 1991 at 11:23:23 PM");
printf(
" and December 15, 1992 at 8:23:45 AM is:¥n %f¥n",
seconds2 - seconds1);
}
CBL LIB,QUOTE
*Module/File Name: IGZTSECS
************************************************
** CBLSECS - Call CEESECS to convert **
** timestamp to number of seconds **
** **
** In this example, calls are made to CEESECS **
** to convert two timestamps to the number of **
** seconds since 00:00:00 14 October 1582. **
** The Lilian seconds for the earlier **
** timestamp are then subtracted from the **
** Lilian seconds for the later timestamp **
** to determine the number of between the **
** two. This result is displayed. **
************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. CBLSECS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SECOND1 COMP-2.
01 SECOND2 COMP-2.
01 TIMESTP.
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 TIMESTP.
01 TIMESTP2.
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 TIMESTP2.
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 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-SECS1.
************************************************
** Specify first timestamp and a picture string
** describing the format of the timestamp
** as input to CEESECS
************************************************
MOVE 25 TO Vstring-length of TIMESTP.
MOVE "1969-05-07 12:01:00.000"
TO Vstring-text of TIMESTP.
MOVE 25 TO Vstring-length of PICSTR.
MOVE "YYYY-MM-DD HH:MI:SS.999"
TO Vstring-text of PICSTR.
************************************************
** Call CEESECS to convert the first timestamp
** to Lilian seconds
************************************************
CALL "CEESECS" USING TIMESTP, PICSTR,
SECOND1, FC.
IF NOT CEE000 of FC THEN
DISPLAY "CEESECS failed with msg "
Msg-No of FC UPON CONSOLE
STOP RUN
END-IF.
PARA-SECS2.
************************************************
** Specify second timestamp and a picture string
** describing the format of the timestamp as
** input to CEESECS.
************************************************
MOVE 25 TO Vstring-length of TIMESTP2.
MOVE "2000-01-01 00:00:01.000"
TO Vstring-text of TIMESTP2.
MOVE 25 TO Vstring-length of PICSTR.
MOVE "YYYY-MM-DD HH:MI:SS.999"
TO Vstring-text of PICSTR.
************************************************
** Call CEESECS to convert the second timestamp
** to Lilian seconds
************************************************
CALL "CEESECS" USING TIMESTP2, PICSTR,
SECOND2, FC.
IF NOT CEE000 of FC THEN
DISPLAY "CEESECS failed with msg "
Msg-No of FC UPON CONSOLE
STOP RUN
END-IF.
PARA-SECS2.
************************************************
** Subtract SECOND2 from SECOND1 to determine the
** number of seconds between the two timestamps
************************************************
SUBTRACT SECOND1 FROM SECOND2.
DISPLAY "The number of seconds between "
Vstring-text OF TIMESTP " and "
Vstring-text OF TIMESTP2 " is: " SECOND2.
GOBACK.
*PROCESS MACRO;
/* Module/File Name: IBMSECS */
/****************************************************/
/** */
/** Function: CEESECS - Change timestamp to seconds */
/** */
/** In this example, CEESECS is called to return an */
/** input timestamp as the number of seconds since */
/** 14 October 1582. */
/** */
/****************************************************/
PLISECS: PROC OPTIONS(MAIN);
%INCLUDE CEEIBMAW;
%INCLUDE CEEIBMCT;
DCL TIMESTP CHAR(255) VARYING;
DCL PICSTR CHAR(255) VARYING;
DCL SECONDS REAL FLOAT DECIMAL(16);
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);
TIMESTP = '10 November 1992'; /* Specify input */
/* date as timestamp */
PICSTR = 'ZD Mmmmmmmmmmmmmmz YYYY';
/* Picture string that descibes timestamp */
/* Call CEESECS to return the input date as */
/* Lilian seconds */
CALL CEESECS ( TIMESTP, PICSTR, SECONDS, FC );
IF FBCHECK( FC, CEE000) THEN DO;
PUT SKIP LIST( 'There were ' || SECONDS
|| ' seconds between 14 Oct 1582 and '
|| TIMESTP );
END;
ELSE DO;
DISPLAY( 'CEESECS failed with msg '
|| FC.MsgNo );
STOP;
END;
END PLISECS;