導入
COBOL開発の現場において、日付取得は避けて通れない処理です。かつての「ACCEPT文による日付取得」は、西暦2桁問題の影響を強く受けるレガシーな手法でした。現代のシステム開発において、日付の扱いは「YYYYMMDD」形式で統一することが鉄則です。本稿では、組込関数であるCURRENT-DATEを活用し、安全かつ確実な日付取得を行うためのTipsを解説します。
基礎知識
CURRENT-DATEは、COBOLの組込関数の一つで、呼び出した瞬間のシステム日時を「YYYYMMDDHHMMSSss+HHMM」という21桁の文字列として返却します。
特に重要なのは、先頭の8桁が「西暦4桁+月2桁+日2桁(YYYYMMDD)」であるという点です。これにより、2000年問題以降のシステムでも、日付の大小比較やソート処理を論理的に正しく行うことが可能になります。
実装/解決策
CURRENT-DATEの戻り値から特定の部分を切り出すには、参照修飾(Reference Modification)という機能を使います。
構文:FUNCTION CURRENT-DATE(開始位置:長さ)
日付を取得するだけであれば、(1:8)を指定するだけで十分です。この値を「PIC X(8)」の領域に格納することで、以降の処理で日付データとして利用可能になります。
サンプルプログラム
以下のコードは、CURRENT-DATEから取得した日付を編集して表示する実用的なサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. GET-DATE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 日付格納用の作業領域
01 WS-CURRENT-DATE-RAW PIC X(21).
01 WS-TODAY-YYYYMMDD PIC X(8).
01 WS-DISPLAY-DATE.
05 WS-YY PIC X(4).
05 FILLER PIC X VALUE ‘/’.
05 WS-MM PIC X(2).
05 FILLER PIC X VALUE ‘/’.
05 WS-DD PIC X(2).
PROCEDURE DIVISION.
> 1. 現在日時を取得して作業領域に格納
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-RAW.
> 2. 先頭8桁(YYYYMMDD)を抽出
MOVE WS-CURRENT-DATE-RAW(1:8) TO WS-TODAY-YYYYMMDD.
> 3. 表示用に編集(例:2023/10/01形式)
MOVE WS-TODAY-YYYYMMDD(1:4) TO WS-YY.
MOVE WS-TODAY-YYYYMMDD(5:2) TO WS-MM.
MOVE WS-TODAY-YYYYMMDD(7:2) TO WS-DD.
DISPLAY “本日の日付: ” WS-DISPLAY-DATE.
GOBACK.
応用・注意点
注意点1:パフォーマンスへの配慮
CURRENT-DATEは実行するたびにシステムから時刻を取得します。数万件のループ処理内で毎回この関数を呼び出すと、システム負荷が高まる可能性があります。大量データ処理を行う場合は、処理開始時に一度だけ取得し、その値を保持(保持用変数にMOVE)して使い回すようにしてください。
注意点2:タイムゾーンの違い
CURRENT-DATEの後半部分(17桁目以降)には、グリニッジ標準時との時差情報が含まれています。もし海外拠点と連携するシステムであれば、この部分も考慮する必要がありますが、国内完結型の事務処理プログラムであれば、基本的には先頭8桁の運用で十分です。
バグ回避のヒント
古いプログラムを保守する際、ACCEPT文が残っている場合は積極的にCURRENT-DATEへの置き換えを推奨します。特に、日付計算を行う前に、必ず「数値としての妥当性チェック(IF WS-TODAY-YYYYMMDD NUMERIC THEN…)」を入れる習慣をつけることで、実行時の異常終了を未然に防ぐことができます。

コメント