日時データ・タイプを処理する

COBOL 日時クラスの項目には、日付、時刻、およびタイム・スタンプ項目が含まれます。 これらの項目は、データ記述項目の FORMAT 文節で宣言されます。 たとえば、
01  group-item.
    05 date1 FORMAT DATE "%m/%d/@Y".
    05 date2 FORMAT DATE.
    05 time1 FORMAT TIME SIZE 8 LOCALE german-locale.
    05 time2 FORMAT TIME "%H:%M:%S".
    05 time3 FORMAT TIME.
    05 timestamp1 FORMAT TIMESTAMP.  
日時クラスの項目の場合、FORMAT 文節は PICTURE 文節の代わりに使用されます。 上の例では、キーワード FORMAT の後に、語 DATE、TIME、または TIMESTAMP がきます。 これらの語は、日時項目のカテゴリーを識別します。
注: 語 DATE および TIME は予約語です。 ただし、語 TIMESTAMP はコンテキストに依存した語です。

日時項目のカテゴリーを示す予約語またはコンテキストに依存した語の後には、フォーマット設定リテラルを入れることができます。 フォーマット設定リテラルとは、日付項目または時刻項目の形式を記述する非数値リテラルです。

データ項目 date1 の場合、%m は月、%d は日、 また @Y は年 (2 桁の世紀を含む) を表します。 文字 % および @ は指定子の先頭にきます。 date1 というフォーマット設定リテラルで使用される 3 つの指定子は、「IBM® Rational® Development Studio for i: ILE COBOL 解説書」に記載されている指定子のセットの一部です。フォーマット設定リテラルは、指定子と区切り文字を組み合わせたものです。 そこで、もう一度 date1 を見てみると、区切り文字が 2 つあり、両方とも文字 / です。

上の例では、各指定子は事前決定されたサイズをもっています。 たとえば、データ項目 time2 は、%H%M、 および %S という 3 つの指定子をもっています。 それらは、時 (2 つの数字)、分 (2 つの数字)、および秒 (2 つの数字) です。 このほかに、区切り記号が 2 つあり、どちらも文字 : です。 したがって、time2 の合計サイズは 8 文字です。

フォーマット設定リテラルでは、区切り文字と指定子の順序は任意ですが、次の規則に従う必要があります。
上の例では、date2timestamp1 のどちらもフォーマット設定リテラルが指定されていません。 タイム・スタンプのカテゴリーの項目は、ユーザー定義フォーマット設定リテラルをもつことができません。 ただし、@Y-%m-%d-%H.%M.%S.@Sm というデフォルトのフォーマット設定リテラルをもっています。 日付または時刻のカテゴリーの項目の場合、 フォーマット設定リテラルがデータ記述項目に明示的に指定されていなければ、SPECIAL-NAMES 段落に指定することができます。 以下に、その例を示します。
      SPECIAL-NAMES.  FORMAT OF DATE IS "@C:%y:%j",
                      FORMAT OF TIME IS "%H:%M:%S:@Sm".  

上記の SPECIAL-NAMES 段落がグループ項目 group-item と同じプログラムに指定されていた場合、date2 の日付形式は @C:%y:%j になります。 また、SPECIAL-NAMES 段落が存在しない場合には、日付項目の形式はデフォルトである ISO がとられます。 ISO 日付の形式は @Y-%m-%d です。フォーマット設定リテラルのない カテゴリー時刻の唯一の項目 (暗黙的または明示的に定義されているもの) は time3 であるため、 上の SPECIAL-NAMES 段落が存在しなければ、time3 は時刻形式 %H:%M:%S:@Sm をもつことになります。 ただし、FORMAT OF TIME 文節が SPECIAL-NAMES 段落にある場合には、形式はデフォルトとして ISO がとられます。 ISO 時刻の形式は %H.%M.%S です。

デフォルトでは、COPY DDS は日時クラスの項目を宣言すると、英数字項目について PICTURE 文節を生成します。 PICTURE 文節を FORMAT 文節に変更するために、いくつかの新しい CVTOPT パラメーター値が定義されました。 それらは、次のものです。 *DATE が指定されていれば、DDS 日付データ・タイプはすべて COBOL 日付項目に変換されます。 たとえば、PICTURE 文節ではなく、FORMAT 文節が生成されます。

DDS では、日付フィールドの形式を指定するために、DATFMT キーワードを指定することができます。 DATFMT キーワードは、ゾーン、パック、および文字の各フィールドに対しても指定できます。 これらのタイプのフィールドでは、COPY DDS は、通常、数字ゾーン、数字パック、および英数字の各データ項目について、 それぞれ PICTURE 文節を生成します。 CVTOPT パラメーターの *CVTTODATE 値を指定すると、 これらの項目について COPY DDS に強制的に FORMAT 文節を生成させることができます。

ゾーン、パック、および文字の各 DDS フィールドに許されている DATFMT パラメーターと、CVTOPT(*CVTTODATE) 変換パラメーターが指定されたときに DDS から生成される、 それぞれに相当する ILE COBOL 形式のリストについては 日時クラスを参照してください。

上に述べたとおり、データ記述項目の FORMAT 文節は、日時クラスの項目を定義します。 このデータ記述項目には、以下に示す文節のうち 1 つまたは複数の文節を含めることもできます。
この同じデータ記述項目が、1 つまたは複数の 88 (条件名) をそれと関連付けることができます。 条件名の VALUE 文節には THRU 句を含めることができます。 以下に示す文節は、日時クラスのデータ記述項目を参照できます。
次のコーディングの部分は、日時クラスの項目の各種定義を示しています。
 01  TimestampT IS TYPEDEF
          FORMAT TIMESTAMP VALUE "1997-12-01-05.52.50.000000".
 01  group-item.
     05  date1 FORMAT DATE OCCURS 3 TIMES VALUE "1997-05-08".
     05  date2 FORMAT DATE "@Y-%m-%d" VALUE "2001-09-08".
     05  date3 REDEFINES date2 FORMAT DATE.
        88  date3-key-dates VALUE "1997-05-01" THRU "2002-05-01".
     05  time1 FORMAT TIME "%H:%M" VALUE "14:10".
     05  time2 LIKE time1.
     05  timestamp1 TYPE TimestampT.                             

上の文節はいずれも、日時クラスの項目と一緒に使用する際にはさまざまな規則があります。

SYNCHRONIZED 文節は日時項目に指定できますが、文書化用としてしか扱われません (項目の位置合わせは行いません)。

日時項目の USAGE 文節は日付または時刻項目の DISPLAY または PACKED-DECIMAL でかまいませんが、タイム・スタンプは USAGE DISPLAY だけです。 日時項目に PACKED-DECIMAL という USAGE がある場合には、フォーマット設定リテラルには指定子しか入れられず (区切り文字は不可)、 しかもその指定子は結果として数字を生じるものでなければなりません。

日時項目の VALUE 文節は、日時項目の形式の非数値リテラルにします。 コンパイル時に、VALUE 文節の非数値リテラルの形式が FORMAT 文節に一致しているかどうかを確かめる検査は行われません。 VALUE 文節の非数値リテラルが正しいものであるようにするのは、プログラマーが行う必要があります。

日時項目と関連付けられたレベル 88 (条件名) は THRU 句をもつことができます。 日時項目と関連付けられたレベル 88 項目の VALUE 文節には、 親項目と一致する形式の非数値リテラルを含めてください。 レベル 88 項目が比較条件で使用されると、結果として日時比較が発生します。

日時項目を参照する LIKE 文節は、そのサイズを変更できません。 LIKE 文節により、新しい項目は、SIZE 文節および LOCALE 文節を含め、FORMAT 文節の属性をすべて継承します。

日時データ項目は、次に示すステートメント、文節、および組み込み関数と一緒に使用できます。

日時データ・タイプは SORT (および MERGE) 操作でも使用できますが、いくつかの制限が適用されます。 これらの制限については 日時データ・タイプに関する考慮事項を参照してください。