バージョン 4.2.5
 —  プログラミングガイド  —

日付情報の処理

このドキュメントでは、Natural アプリケーションでの日付情報の処理について、さまざまな面から説明します。

次のトピックについて説明します。


日付フィールドの編集マスクおよび日付システム変数

日付フィールドの値を特定の表現で出力する場合は、通常、フィールドに編集マスクを指定します。 編集マスクを使用して、1 文字ずつどのように出力するかを指定します。

現在の日付を特定の表現で使用する場合、日付フィールドを定義して編集マスクを指定する必要はありません。代わりに、日付システム変数を使用します。 Natural には、さまざまな日付システム変数が用意されています。その中には、表現の異なる現在日付も含まれています。 これらの表現には 2 桁の年コンポーネントを持つものもあれば、4 桁の年コンポーネントを持つものもあります。

すべての日付システム変数のリストと詳細については、『システム変数』ドキュメントを参照してください。

Top of page

デフォルトの日付編集マスク - DTFORM パラメータ

DTFORM プロファイルパラメータによって、Natural レポートのデフォルトタイトルの日付部分、日付定数、および日付入力に使用されるデフォルトのフォーマットが決まります。

この日付フォーマットを使用して、日付の年、月、日の各コンポーネントの順序、およびこれらのコンポーネント間で使用するデリミタ文字を指定します。

有効な DTFORM の設定は、以下のとおりです。

設定 日付フォーマット*
DTFORM=I yyyy-mm-dd 2005-12-31
DTFORM=G dd.mm.yyyy 31.12.2005
DTFORM=E dd/mm/yyyy 31/12/2005
DTFORM=U mm/dd/yyyy 12/31/2005

* dd = 日、mm = 月、yyyy = 年。

DTFORM パラメータは、Natural パラメータモジュール/ファイル内で設定できます。また、Natural を起動するときにダイナミックに設定することもできます。 デフォルトでは、DTFORM=I が適用されます。

Top of page

英数字表現の日付フォーマット - DF パラメータ

編集マスクが指定されている場合、フィールド値の表現は編集マスクによって決まります。 編集マスクが指定されていない場合、フィールド値の表現は、セッションパラメータ DF とプロファイルパラメータ DTFORM の組み合せによって決まります。

DF パラメータでは、以下の日付表現の 1 つを選択できます。

DF=S 2 桁の年コンポーネントとデリミタを使用する 8 バイトの表記です(yy-mm-dd)。
DF=I デリミタを使用しない、4 桁の年コンポーネントの 8 バイトの表記です(yyyymmdd)。
DF=L 4 桁の年コンポーネントとデリミタを使用する 10 バイトの表記です(yyyy-mm-dd)。

各表現に対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

デフォルトでは、DF=S が適用されます(INPUT ステートメントを除く。下記参照)。

セッションパラメータ DF は、コンパイル時に評価されます。

このパラメータは、以下のステートメントで指定できます。

上記のステートメントのいずれかで指定すると、DF パラメータは以下のように適用されます。

ステートメント DF パラメータの効果
DISPLAYWRITEPRINT これらのステートメントの 1 つを使用して日付変数の値を出力すると、出力する前に値が英数字表現に変換されます。 DF パラメータにより、使用される表現が決まります。
MOVECOMPRESS MOVE または COMPRESS の各ステートメントを使用して日付変数の値を英数字フィールドに転送すると、転送する前に値が英数字表現に変換されます。 DF パラメータにより、使用される表現が決まります。
STACKRUNFETCH 日付変数の値をスタックに格納すると、スタックに格納する前に値が英数字表現に変換されます。 DF パラメータにより、使用される表現が決まります。

FETCH ステートメントまたは RUN ステートメントのパラメータとして日付変数を指定する場合も同様です(これらのパラメータもスタック経由で渡されるため)。

INPUT INPUT ステートメントでデータ変数を使用する場合、DF パラメータによって、値をどのようにフィールドに入力する必要があるかが決まります。

ただし、DF パラメータを指定せずに日付変数を INPUT ステートメントで使用すると、デリミタ付きの 2 桁の年コンポーネント、またはデリミタなしの 4 桁の年コンポーネントのいずれかで日付を入力できます。 この場合も、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

注意:
DF=S で提供される年情報は 2 桁のみです。これは、日付の値に世紀が含まれていると、変換時にこの情報が失われることを意味します。 世紀の情報を保持するには、DF=I または DF=L を設定します。

WRITE ステートメントでの DF パラメータの例

これらの例では、DTFORM=G が適用されると仮定します。

/* DF=S (default) 
WRITE *DATX   /* Output has this format: dd.mm.yy 
END
FORMAT DF=I  
WRITE *DATX   /* Output has this format: ddmmyyyy 
END
FORMAT DF=L 
WRITE *DATX   /* Output has this format: dd.mm.yyyy 
END

MOVE ステートメントでの DF パラメータの例

この例では、DTFORM=E が適用されると仮定します。

DEFINE DATA LOCAL 
  1 #DATE  (D) INIT <D'31/12/2005'> 
  1 #ALPHA (A10) 
END-DEFINE 
... 
MOVE #DATE        TO #ALPHA /* Result: #ALPHA contains 31/12/05   
MOVE #DATE (DF=I) TO #ALPHA /* Result: #ALPHA contains 31122005   
MOVE #DATE (DF=L) TO #ALPHA /* Result: #ALPHA contains 31/12/2005 
...

STACK ステートメントでの DF パラメータの例

この例では、DTFORM=I が適用されると仮定します。

DEFINE DATA LOCAL 
  1 #DATE  (D) INIT <D'2005-12-31'> 
  1 #ALPHA1(A10) 
  1 #ALPHA2(A10) 
  1 #ALPHA3(A10) 
END-DEFINE 
... 
STACK TOP DATA #DATE (DF=S) #DATE (DF=I) #DATE (DF=L) 
... 
INPUT #ALPHA1 #ALPHA2 #ALPHA3 
... 
/* Result: #ALPHA1 contains 05-12-31   
/*         #ALPHA2 contains 20051231   
/*         #ALPHA3 contains 2005-12-31 
...

INPUT ステートメントでの DF パラメータの例

この例では、DTFORM=I が適用されると仮定します。

DEFINE DATA LOCAL 
  1 #DATE1 (D) 
  1 #DATE2 (D) 
  1 #DATE3 (D) 
  1 #DATE4 (D) 
END-DEFINE 
... 
INPUT #DATE1 (DF=S) /* Input must have this format: yy-mm-dd 
      #DATE2 (DF=I) /* Input must have this format: yyyymmdd 
      #DATE3 (DF=L) /* Input must have this format: yyyy-mm-dd 
      #DATE4        /* Input must have this format: yy-mm-dd or yyyymmdd 
...

Top of page

出力用の日付フォーマット - DFOUT パラメータ

セッション/プロファイルパラメータ DFOUT は、編集マスクが指定されておらず、DF パラメータも適用されていない、INPUTDISPLAYWRITE、および PRINT の各ステートメントの日付フィールドにのみ適用されます。

INPUTDISPLAYPRINT、および WRITE の各ステートメントによって表示され、編集マスクが指定されておらず、DF パラメータも適用されてない日付フィールドの場合は、プロファイル/セッションパラメータ DFOUT によって、表示するフィールド値のフォーマットが決まります。

有効な DFOUT の設定は、以下のとおりです。

DFOUT=S 日付変数は、2 桁の年コンポーネント、およびパラメータ DTFORM で指定されているデリミタを使用して表示されます(yy-mm-dd)。
DFOUT=I 日付変数は、デリミタなしの 4 桁の年コンポーネントで表示されます(yyyymmdd)。

デフォルトでは、DFOUT=S が適用されます。 どちらの DFOUT 設定でも、日付値の年、月、日の各コンポーネントの順序は、DTFORM パラメータによって決まります。

どちらの日付値表現でも 8 バイトのフィールドに収まるため、日付フィールドの長さは DFOUT 設定の影響を受けません。

DFOUT パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS を使用して設定できます。 これは、ランタイム時に評価されます。

例:

この例では、DTFORM=I が適用されると仮定します。

DEFINE DATA LOCAL 
1 #DATE  (D) INIT <D'2005-12-31'> 
END-DEFINE 
... 
WRITE #DATE        /* Output if DFOUT=S is set ...: 05-12-31 
                   /* Output if DFOUT=I is set ...: 20051231 
WRITE #DATE (DF=L) /* Output (regardless of DFOUT): 2005-12-31 
...

Top of page

スタック用の日付フォーマット - DFSTACK パラメータ

セッション/プロファイルパラメータ DFSTACK は、DF パラメータが指定されていない、STACKFETCH、および RUN の各ステートメントで使用されている日付フィールドにのみ適用されます。

DFSTACK パラメータによって、STACKRUNFETCH の各ステートメント経由でスタックに格納される日付変数の値のフォーマットが決まります。

有効な DFSTACK の設定は、以下のとおりです。

DFSTACK=S 日付変数は、2 桁の年コンポーネント、およびプロファイルパラメータ DTFORM で指定されているデリミタを使用してスタックに格納されます(yy-mm-dd)。
DFSTACK=C DFSTACK=S と同じです。 ただし、世紀の変更はランタイム時にインターセプトされます。
DFSTACK=I 日付変数は、デリミタなしの 4 桁の年コンポーネントでスタックに格納されます(yyyymmdd)。

デフォルトでは、DFSTACK=S が適用されます。 DFSTACK=S は、世紀の情報なし(つまり、失われます)で日付値がスタックに格納されることを意味します。 その後、値をスタックから読み込んで別の日付変数に格納すると、世紀情報は現在のものであるとみなされるか、または YSLW パラメータ(下記参照)の設定によって決まります。 この操作によって、元の日付値と異なる世紀が設定される可能性があります。ただし、この場合、Natural はエラーを発行しません。

世紀の情報なしで日付値がスタックに格納されるという点では、DFSTACK=CDFSTACK=S と同じ動作をします。 ただし、(YSLW パラメータ、または元の世紀が現在の世紀でなかったために)スタックから読み込んだ値の世紀情報が元の日付値と異なった場合、Natural はランタイムエラーを発行します。

注意:
このランタイムエラーは、値をスタックに格納する時点ですでに発行されています。

DFSTACK=I を使用すると、世紀の情報を失わずに日付値を 8 バイトの長さでスタックに格納できます。

DFSTACK パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS を使用して設定できます。 これは、ランタイム時に評価されます。

例:

以下の例では、DTFORM=I および YSLW=0 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE  (D) INIT <D'2005-12-31'> 
  1 #ALPHA1(A8) 
  1 #ALPHA2(A10) 
END-DEFINE 
... 
STACK TOP DATA #DATE #DATE (DF=L) 
... 
INPUT #ALPHA1 #ALPHA2 
... 
/* Result if DFSTACK=S or =C is set: #ALPHA1 contains 05-12-31   
/* Result if DFSTACK=I is set .....: #ALPHA1 contains 20051231   
/* Result (regardless of DFSTACK) .: #ALPHA2 contains 2005-12-31 
...

Top of page

年スライディングウィンドウ - YSLW パラメータ

プロファイルパラメータ YSLW を使用すると、2 桁の年の値に対する世紀を指定できます。

YSLW パラメータは、Natural パラメータモジュール/ファイル内で設定できます。また、Natural を起動するときにダイナミックに設定することもできます。 2 桁の年コンポーネントを持つ英数字の日付値を日付変数に移すと、このパラメータはランタイム時に評価されます。 これは、以下のデータ値に適用されます。

YSLW パラメータによって、"年スライディングウィンドウ" でカバーする年の範囲を特定します。 スラインディングウィンドウのメカニズムは、2 桁の年の日付が 100 年の "ウィンドウ" 内にあるものと仮定します。 この 100 年の範囲で、すべての 2 桁の年の値を特定の世紀に一意に関連付けることができます。

YSLW パラメータを使用して、その 100 年の範囲を何年前から開始するかを指定します。現在の年から YSLW の値を引くことにより、ウィンドウ範囲の最初の年が決定します。

YSLW パラメータの有効な値は、0~99 です。 デフォルト値は YSLW=0 です。これは、スライディングウィンドウメカニズムを使用しないことを意味します。つまり、2 桁の年を持つ日付は、現在の世紀にあるとみなされます。

例 1:

現在の年が 2005 年の場合に YSLW=40 を指定すると、スラインディングウィンドウは 1965~2064 年をカバーします。 65~99 の 2 桁の年の値 nn は、19nn と解釈されます。一方、00~64 の 2 桁の年の値 nn は、20nn と解釈されます。

例 2:

現在の年が 2005 年の場合に YSLW=20 を指定すると、スラインディングウィンドウは 1985~2084 年をカバーします。 85~99 の 2 桁の年の値 nn は、19nn と解釈されます。一方、00~84 の 2 桁の年の値 nn は、20nn と解釈されます。

Top of page

DFSTACK と YSLW の組み合わせ

以下の例で、パラメータ DFSTACKYSLW をさまざまに組み合わせて使用することによる効果を説明します。

注意:
これらのすべての例において、DTFORM=I が適用されているものとします。

例 1:

以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=S(デフォルト値)および YSLW=20 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'1956-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* year sliding window determines 56 to be 2056 
... 
/* Result: #DATE2 contains 2056-12-31
           even if #DATE1 is set to <D'2156-12-31'>

この場合、年スライディングウィンドウは適切に設定されないため、世紀の情報は(意図しない値に)変更されます。

例 2:

以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=S(デフォルト値)および YSLW=60 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'1956-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* year sliding window determines 56 to be 1956 
... 
/* Result: #DATE2 contains 1956-12-31
           even if #DATE1 is set to <D'2056-12-31'>

この場合、年スライディングウィンドウは適切に設定されるため、世紀の情報は正しく復元されます。

例 3:

以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=C および YSLW=0(デフォルト値)が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'1956-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* 56 is assumed to be in current century -> 1956 
... 
/* Result: RUNTIME ERROR (UNINTENDED CENTURY CHANGE)

この場合、世紀情報は(意図しない値に)変更されます。 ただし、この変更は DFSTACK=C 設定によってインターセプトされます。

例 4:

以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=C および YSLW=60 が適用されているものとします。

DEFINE DATA LOCAL 
  1 #DATE1 (D) INIT <D'2056-12-31'> 
  1 #DATE2 (D) 
END-DEFINE 
... 
STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked) 
... 
INPUT #DATE2          /* year sliding window determines 56 to be 1956 
... 
/* Result: RUNTIME ERROR (UNINTENDED CENTURY CHANGE)

この場合、世紀情報は年スライディングウィンドウに従って変更されます。 ただし、この変更は DFSTACK=C 設定によってインターセプトされます。

Top of page

年固定ウィンドウ

このトピックの詳細については、プロファイルパラメータ YSLW の説明を参照してください。

Top of page

デフォルトページタイトル用の日付フォーマット - DFTITLE パラメータ

セッション/プロファイルパラメータ DFTITLE によって、デフォルトのページタイトルDISPLAYWRITEPRINT の各ステートメントの出力)の日付フォーマットが決まります。

DFTITLE=S 日付は、デリミタ付きの 2 桁の年コンポーネントで出力されます(yy-mm-dd)。
DFTITLE=L 日付は、デリミタ付きの 4 桁の年コンポーネントで出力されます(yyyy-mm-dd)。
DFTITLE=I 日付は、デリミタなしの 4 桁の年コンポーネントで出力されます(yyyymmdd)。

これらの各出力フォーマットに対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM パラメータによって決まります。

DFTITLE パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS を使用して設定できます。 これは、ランタイム時に評価されます。

例:

この例では、DTFORM=I が適用されると仮定します。

WRITE 'HELLO' 
END
/* 
/* Date in page title if DFTITLE=S is set ...: 05-10-31 
/* Date in page title if DFTITLE=L is set ...: 2005-10-31
/* Date in page title if DFTITLE=I is set ...: 20051031

注意:
DFTITLE パラメータは、WRITE TITLE ステートメントで指定されているユーザー定義のページタイトルには効果がありません。

Top of page