CEESECS - タイム・スタンプから秒数への変換

CEESECS は、タイム・スタンプを表すストリングをリリアン秒数に変換します (1582 年 10 月 14 日 00:00:00 以降の秒数)。 このサービスによって、2 つのタイム・スタンプ間で経過した時間を計算するなどの時間演算が簡単になります。

CEESECS は、CEESETL 呼び出し可能サービスと setlocale() 関数からの影響は受けません。COUNTRY ランタイム・オプションまたは CEE3CTY 呼び出し可能 サービスの国別コード設定値によってのみ影響を受けます。

CEESECS の逆は CEEDATM です。これは、output_seconds を文字形式に変換します。デフォルトでは、2 桁で表した年は、システム日付の 80 年前に始まる 100 年の範囲内にあります。したがって、1995 年には、2 桁の年のすべては、1915 年から 2014 年まで (1915 年と 2014 年を含む) の間の日付を表します。呼び出し可能サービス CEESCEN を使用すると、この範囲を変更することができます。
構文図を読む構文図をスキップする
構文

>>-CEESECS--(--input_timestamp--,--picture_string--,------------>

>--output_seconds--,--fc--)------------------------------------><

input_timestamp (入力)
picture_string で指定された形式と一致する形式で日付またはタイム・スタンプを表す長さフィールド付き文字ストリング。文字ストリングには 5 から 80 までのピクチャー文字を入れなければなりません (5 と 80 を含む)。input_timestamp には、先行ブランクまたは後書きブランクを入れることができます。構文解析は、最初の非ブランク文字から始まります。(ピクチャー・ストリングそのものに先行ブランクがある場合を除きます。この場合には、構文解析を始め る前に CEESECS はこのブランク分だけスキップします。)

有効な日付を picture_string で指定される日付の形式に従って解析したあと CEESECS は残りのすべての文字を無視します。有効な日付の範囲は、1582 年の 10 月 15 日から 9999 年の 12 月 31 日までです (1582 年 10 月 15 日と 9999 年 12 月 31 日を含む)。完全な日付を指定する必要があります。有効な時間の範囲は、00:00:00.000 から 23:59:59.999 までです。

次の例に示すように、時間値の一部分またはすべてが省略された場合には、残りの値が 0 に置き換えられます。
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
picture_string (入力)
input_timestamp に指定された日付または タイム・スタンプ値の形式を示すハーフワード長の接頭部付き文字ストリング (VSTRING)。picture_string の各文字は、input_timestamp の文字を表します。例えば、MMDDYY HH.MI.SS を picture_string として指定すると、CEESECS は input_char_date の 060288 15.35.02 を 1988 年 6 月 2 日午後 3:35:02 として読み取ります。スラッシュ (/) のような区切り文字がピクチャー・ストリングにある場合には、先行ゼロを省略することができます。例えば、CEESECS に対する以下の呼び出しは、変数 secs に同じ値を割り当てます。
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 を参照してください。

output_seconds (出力)
1582 年 10 月 14 日 00:00:00 からの秒数を表す 64 ビットの倍精度浮動 小数点数。うるう秒数はカウントしません。例えば、1582 年 10 月 15 日の 00:00:01 は、リリアン形式においては 86,401 秒 (24*60*60 + 01) です。1988 年 5 月 16 日の 19:00:01.12 は、12,799,191,601.12 秒です。

表示可能な最大値は 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 (これは、経過した時間を表すため) で容易に実行することができます。うるう年および年の終わりの変則性は計算に影響を及ぼしません。

fc (出力)
このサービスの結果を示す 12 バイトの フィードバック・コード (言語によってはオプション)。このパラメーターを省略する場合は、呼び出し可能サービスの呼び出しを参照して、フィードバック・コードが省略されたことを示すための適切な構文を確認してください。

このサービスの結果、出力される記号条件は以下のとおりです。

コード 重大度 メッセージ番号 メッセージ・テキスト
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 が英数字フィールドで非英数字データを検出したか、タイム・スタンプ・ストリングがピクチャー・ストリングに一致しなかった。

使用上の注意

詳細情報

  1. 以下は、C/C++ によって呼び出される 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);
    }
  2. 以下は、COBOL によって呼び出される CEESECS の例です。
    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.
  3. 以下は、PL/I によって呼び出される CEESECS の例です。
    *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;