Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$ZDATE

日付を検証し、これを内部形式から指定の表示形式に変換します。

Synopsis

$ZDATE(hdate,dformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)
$ZD(hdate,dformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt)

パラメータ

hdate 内部の日付形式値を指定する整数。この整数は、1840 年 12 月 31 日からの経過日数を表します。hdate$HOROLOG が指定されている場合、$HOROLOG の日付部分のみが使用されます。後述の "hdate" を参照してください。
dformat オプション — 返される日付の形式を表す整数コード。後述の "dformat" を参照してください。
monthlist オプション — 一連の月名を表す文字列または変数の名前。この文字列は、区切り文字から始まり、12 個のエントリは、この区切り文字で分けられる必要があります。後述の "monthlist" を参照してください。
yearopt オプション — 年を 2 桁または 4 桁のどちらで表記するかを指定する整数コード。後述の "yearopt" を参照してください。
startwin オプション — 日付を 2 桁の年で表す必要があるスライディング・ウィンドウの最初を指定する数値。 後述の "startwin" を参照してください。
endwin オプション — 日付を 2 桁の年で表す必要があるスライディング・ウィンドウの最後を指定する数値。後述の "endwin" を参照してください。
mindate オプション — 有効な日付範囲の下限。$HOROLOG 整数日付カウントの形式で指定し、0 は 1840 年 12 月 31 日を表します。正または負の整数として指定できます。後述の "mindate" を参照してください。
maxdate オプション — 有効な日付範囲の上限。$HOROLOG 整数日付カウントの形式で指定します。後述の "maxdate" を参照してください。
erropt オプションhdateが無効のときに返す式。このパラメータに値を指定すると、hdate 値が無効または範囲外の場合に生じるエラー・コードが抑制されます。 エラー・メッセージを発行する代わりに、$ZDATEerropt を返します。後述の "erropt" を参照してください。
localeopt

オプションdformatmonthlistyearoptmindatemaxdate の既定値、およびその他の日付特性 (日付区切り文字など) に対してどのロケールを使用するかを指定するブーリアン・フラグ。

localeopt=0:現在のロケール・プロパティ設定によって、これらのパラメータの既定値が決定されます。

localeopt=1:ODBC 標準ロケールによって、これらのパラメータの既定値が決定されます。

localeopt 未指定:dformat 値によって、これらのパラメータの既定値が決定されます。dformat=3 の場合は、ODBC の既定値が使用されます。日本およびイスラム暦の日付の dformat 値については、それぞれの既定値が使用されます。その他すべての dformat 値については、現在のロケール・プロパティ設定が既定値として使用されます。後述の "localeopt" を参照してください。

指定のパラメータ値間で省略されたパラメータは、プレースホルダのコンマで示されます。末尾のプレースホルダのコンマは必要ありませんが、あってもかまいません。省略されたパラメータを示すコンマの間に空白があってもかまいません。

概要

$ZDATE 関数は、内部の格納形式 ($HOROLOG) で指定した日付を、別の日付表示形式に変換します。$ZDATE によって返される値は、使用するパラメータにより異なります。

単純な $ZDATE 形式

$ZDATE(hdate) は $ZDATE の最も基本的な形式で、指定した hdate に対応する表示形式の日付を返します。hdate は、1840 年 12 月 31 日から経過した日数の整数値で、範囲は、0 ~ 2980013 (12/31/1840 ~ 12/31/9999) です。

既定では、$ZDATE(hdate) は 1900 年から 1999 年までの年を 2 桁で表します。1900 年より前と 1999 年より後の年は、4 桁で表します。次に例を示します。

  WRITE $ZDATE(21400),!  ; returns 08/04/1899
  WRITE $ZDATE(50000),!  ; returns 11/23/77
  WRITE $ZDATE(60000),!  ; returns 04/10/2005
  WRITE $ZDATE(0),!      ; returns 12/31/1840

$HOROLOG の日付を $ZDATE に提供する場合は、日付部分のみが使用されます。$HOROLOG では、コンマで区切られた 2 つの整数として、日付と時刻が表されます。コンマ (数値以外の文字) が検出されると、$ZDATE はその文字列の残りを無視します。以下の例で、$ZDATE は、04/10/2005 と $HOROLOG 形式の値による現在の日付を返します。

   WRITE !,$ZDATE("60000,12345")
   WRITE !,$ZDATE($HOROLOG)

日付の既定値のカスタマイズ

Caché の起動時、既定の日付形式は、dformat=1 に初期化されています。これは日付をスラッシュで区切るアメリカ日付形式 (MM/DD/[YY]YY) です。この形式およびその他の既定の形式を現在のロケール用に設定するには、SET ^SYS("NLS","Config","LocaleFormat")=1 のグローバル変数を設定します。これは、すべてのプロセスのすべての既定の形式を現在のロケール値に設定します。これらの既定は、このグローバルが変更されるまで維持されます。

Note:

ここでは、localeopt が未定義または 0 に設定されているときに適用されるユーザ・ロケール定義について説明します。localeopt=1 の場合、$ZDATE は、定義済みの ODBC ロケールを使用します。

NLS (各国言語サポート) を使用して現在のプロセスの既定の形式を上書きすることもできます。すべての既定の形式を指定したロケールの値に変更することも、個々の形式の値を変更することもできます。

  • 既定の形式をすべて (既定の日付形式を含む) 指定のロケールのプロパティに設定するには、SET fmt=##class(%SYS.NLS.Format).%New("lname") メソッド呼び出しを実行します。lname は目的のロケールの NLS 名です (例えば、deuw=German、espw=Spanish、fraw=French、ptbw=Brazilian Portuguese、rusw=Russian、jpnw=Japanese。全ロケールのリストは、管理ポータルで システム, 構成, NLS設定, ロケール定義 を参照してください)。これらの既定を現在のロケールのプロパティに設定するには、"current"lname または空の文字列 ("") を指定します。

  • 既定の日付形式を指定した dformat 形式に設定するには、SetFormatItem()Opens in a new tab メソッド、つまり SET rtn=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",n) を呼び出します。n は既定にする dformat 値の数です。

以下の例では、すべての既定の形式を Russian ロケールに設定し、既定の形式 (Russian) で $ZDATE の日付を返し、既定の形式を現在のロケールの既定にリセットします。Russian ロケールでは、日付部分の区切り文字としてスラッシュではなく、ピリオドが使用されることに注意してください。

   IF $SYSTEM.Version.IsUnicode() {
   WRITE !,$ZDATE($HOROLOG)
   SET fmt=##class(%SYS.NLS.Format).%New("rusw")
   WRITE !,$ZDATE($HOROLOG)
   SET fmt=##class(%SYS.NLS.Format).%New("current")
   WRITE !,$ZDATE($HOROLOG)
   }
   ELSE {WRITE "This example requires a Unicode installation of Caché"}

以下の例では、個々の既定の形式を設定しています。最初の $ZDATE は既定の形式で日付を返します。最初の SetFormatItem()Opens in a new tab メソッドは、2 つ目の $ZDATE で示されるように、既定値を dformat=4、またはヨーロッパ日付形式 (DD/MM/[YY]YY) に変更します。2 つ目の SetFormatItem() メソッドは、(dformat が -1、1、4 および 15 の場合に影響する) 日付区切り文字に対する既定値を変更します。この例では、3 つ目の $ZDATE で示されるように、日付区切り文字は、ドット (“.”) に設定されています。最後に、このプログラムは元の日付形式の値をリストアします。

InitialVals
   SET fmt=##class(%SYS.NLS.Format).GetFormatItem("DateFormat")
   SET sep=##class(%SYS.NLS.Format).GetFormatItem("DateSeparator")
   WRITE !,$ZDATE($HOROLOG)
ChangeVals
   SET x=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",4)
   WRITE !,$ZDATE($HOROLOG)
   SET y=##class(%SYS.NLS.Format).SetFormatItem("DateSeparator",".")
   WRITE !,$ZDATE($HOROLOG)
RestoreVals
   SET x=##class(%SYS.NLS.Format).SetFormatItem("DateFormat",fmt)
   SET y=##class(%SYS.NLS.Format).SetFormatItem("DateSeparator",sep)
   WRITE !,$ZDATE($HOROLOG)

サポートされるロケールの既定の日付形式の詳細は、"Caché ObjectScript の使用法" の "日付" を参照してください。

パラメータ

hdate

1840 年 12 月 31 日から経過した日数を示す内部の日付形式値。既定では、この値は 0 から 2980013 の範囲内の整数である必要があります。hdate は、数値、文字列リテラル、または式として指定できます。Caché は、hdateキャノニック形式に変換します。数値文字列 ($HOROLOG 値など) は、最初の非数値文字で切り捨てられます。非数値文字列は、整数 0 として評価されます。整数に解決されない浮動小数点数を指定すると、<ILLEGAL VALUE> エラーが発生します。

既定では、最も早い有効な hdate は 0 です (1840 年 12 月 31 日)。DateMinimum プロパティの既定値は 0 であるため、既定では、日付は正の整数に制限されています。現在のロケールの DateMinimum プロパティが、過去の日付を表す負の整数以下の負の整数に設定されていれば、過去の日付を負の整数を使用して指定できます。DateMinimum の有効な最小値は -672045 であり、これは 0001 年 1 月 1 日に相当します。Caché では、ISO 8601 標準に準拠してグレゴリオ暦が “西暦 1 年” まで遡って適用された先発グレゴリオ暦が使用されています。その理由の 1 つは、グレゴリオ暦が採用された時期は国ごとに異なるからです。例えば、欧州大陸諸国の多くでは 1582 年に採用された一方で、英国と米国では 1752 年に採用されました。このため、ご使用の地域でグレゴリオ暦が採用された時期より前の Caché の日付は、その当時にその地域で採用されていた暦に基づいて記録された歴史上の日付に対応していない可能性があります。1840 年より前の日付の詳細は、"mindate" パラメータを参照してください。

hdate 値が無効または範囲外の場合に生じるエラーは、erropt パラメータで示されます。

dformat

返される日付の形式。有効な値は以下のとおりです。

意味
1 MM/DD/[YY]YY (07/01/97 または 03/27/2002) — アメリカの数値形式。日付区切り文字 (/ または .) は、現在のロケール設定から取得されます。
2 DD Mmm [YY]YY (01 Jul 97 あるいは 27 Mar 2002)
3 YYYY-MM-DD (1997-07-01 あるいは 2002-03-27) — ODBC 形式。 既定では、この形式はユーザの現在のロケール設定 (localeopt=1) に依存しません。したがって、日付を ODBC 標準交換形式で指定します。日付に対するユーザの現在のロケール設定をこの形式で使用するには、localeopt=0 に設定します。
4 DD/MM/[YY]YY (01/07/97 または 27/03/2002) — ヨーロッパの数値形式。日付区切り文字 (/ または .) は、現在のロケール設定から取得されます。
5 Mmm [D]D, YYYY (Jul 1, 1997 あるいは Mar 27, 2002)
6 Mmm [D]D YYYY (Jul 1 1997 あるいは Mar 27 2002)
7 Mmm DD [YY]YY (Jul 01 1997 あるいは Mar 27 2002)
8 YYYYMMDD (19970701 あるいは 20020327) — 数値形式
9 Mmmmm [D]D, YYYY (July 1, 1997 あるいは March 27, 2002)
10 W (2) — 曜日の番号。0 (日) から 6 (土) までの数値で指定します。$SYSTEM.SQL.DAYOFWEEK()Opens in a new tab メソッドと比較してください。
11 Www (Tue) — 曜日の略名
12 Wwwwww (Tuesday) — 正式な曜日の名前
13 [D]D/[M]M/YYYY (1/7/2549 または 27/11/2549) — タイ語の日付形式。日と月は、ヨーロッパ形式と同じですが、先頭に 0 は付きません。年は仏教紀元 (BE) で、グレゴリオ暦の年に 543 年追加して計算されます。
14 nnn (354) — 年の日付
15 DD/MM/[YY]YY (01/07/97 や 27/03/2002) — ヨーロッパ形式 (dformat=4 と同じ)。日付区切り文字 (/ または .) は、現在のロケール設定から取得されます。
16 YYYYc[M]Mc[D]Dc — 日本の日付形式。年、月、および日の数は、他の日付形式と同じです。先頭のゼロは省略されます。“年”、“月”、および “日” の日本語の文字 (ここでは c として表示) は、年、月、および日の数の後に挿入されます。これらの文字は、年=$CHAR(24180)、月=$CHAR(26376)、および日=$CHAR(26085) です。
17 YYYYc[M]Mc[D]Dc — 日本の日付形式。dformat 16 と同じです。ただし、“年” および “月” の日本語の文字の後に空白が挿入されます。
18 [D]D Mmmmm YYYY — Tabular Hijri (イスラム) 日付形式 (完全な月名を示す)。日の先頭のゼロは省略され、年の先頭のゼロは組み込まれます。Caché 日付 -445031 (07/19/0622 C.E.)= 1 Muharram 0001。
19 [D]D [M]M YYYY — Tabular Hijri (イスラム) 日付形式 (完全な月番号を示す)。日と月の先頭のゼロは省略され、年の先頭のゼロは組み込まれます。Caché 日付 -445031 (07/19/0622 C.E.)= 1 1 0001。
20 [D]D Mmmmm YYYY — Observed Hijri (イスラム) 日付形式 (完全な月名を示す)。既定で Tabular Hijri (dformat 18) になります。Tabular での計算をオーバーライドするには、新月周期の観測を追加するために %Calendar.HijriOpens in a new tab クラスを使用します。
21 [D]D [M]M YYYY — Observed Hijri (イスラム) 日付形式 (完全な月番号を示す)。 既定で Tabular Hijri (dformat 19) になります。 Tabular での計算をオーバーライドするには、新月周期の観測を追加するために %Calendar.HijriOpens in a new tab クラスを使用します。
-1 有効な dformat 値は、ユーザのロケール (localeopt=0 または未定義の場合)、あるいは ODBC ロケール (既定は dformat=3) のいずれかから取得します。dformat をユーザのロケールから取得した場合、これは fmt.DateFormat の値になります。fmt は、現在のプロセスに関連付けられた ##class(%SYS.NLS.Format) のインスタンスです。dformat を指定しなければ、これが既定の振る舞いになります。詳細は、“日付の既定値のカスタマイズ” を参照してください。

各項目の内容は次のとおりです。

構文 意味
YYYY YYYY は 4 桁の年です。[YY]YY は、hdate がアクティブ・ウィンドウ内で 2 桁の場合は 2 桁の年、それ以外は 4 桁の年です。
MM 2 桁の月 : 01 から 12。[M]M は、1 月から 9 月では先頭のゼロが省略されることを示します。
DD 2 桁の日 : 01 から 31。[D]D は、1 日から 9 日では先頭のゼロが省略されることを示します。
Mmm 現在のロケールの MonthAbbr プロパティから取得した月の省略形。別の月の省略形 (あるいは任意の長さの名前) は、$ZDATEmonthlist パラメータとして指定したオプションのリストから取得することができます。以下は MonthAbbr の既定値です。

“Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec”

Mmmmm 現在のロケールの MonthName プロパティによって指定される正式な月名。以下はその既定値です。

“January February March ...November December”

W 曜日を示す 0 から 6 の数字。

(例) Sunday は 0、Monday は 1、Tuesday は 2。

Www 現在のロケールの WeekdayAbbr プロパティによって指定される曜日の省略形。以下はその既定値です。

“Sun Mon Tue Wed Thu Fri Sat”

Wwwwww 現在のロケールの WeekdayName プロパティによって指定される曜日の正式な名前。以下はその既定値です。

“Sunday Monday Tuesday ...Friday Saturday”

nnn 指定された年の日付。常に 3 桁で示され、必要に応じて先頭にゼロが付きます。値は、001 ~ 365 (うるう年の場合は 366) です。

dformat の既定値

dformat を省略するか、-1 に設定した場合、dformat の既定値は localeopt パラメータと NLS の DateFormat プロパティに依存します。

  • localeopt=1 の場合、dformat の既定値は ODBC 形式です。monthlistyearoptmindate、および maxdate パラメータの既定値も、ODBC 形式に設定されます。これは、dformat=3 を設定した場合と同じです。

  • localeopt=0 または未指定の場合、dformat の既定値は NLS の DateFormat プロパティから取得されます。DateFormat=3 の場合、dformat の既定値は ODBC 形式です。ただし、DateFormat=3 は monthlistyearoptmindate、および maxdate パラメータの既定値に影響しません。これらは、NLS の現在のロケール定義で指定されます。

ユーザのロケールの既定の日付形式を決定するには、GetFormatItem()Opens in a new tab NLS クラス・メソッドを呼び出します。

  WRITE ##class(%SYS.NLS.Format).GetFormatItem("DateFormat")

ヨーロッパ日付形式 (dformat=4、DD/MM/YYYY の順) は、ヨーロッパの多くの言語 (すべてではない) で既定です。これには、“/” を DateSeparator 文字として使用するイギリス英語、フランス語、ドイツ語、イタリア語、スペイン語、ポルトガル語、および “.” を DateSeparator 文字として使用するチェコ語 (csyw)、ロシア語 (rusw)、スロバキア語 (skyw)、スロベニア語 (svnw)、ウクライナ語 (ukrw) が含まれます。サポートされるロケールの既定の日付形式の詳細は、"Caché ObjectScript の使用法" の "日付" を参照してください。

dformat の設定

dformat が 3 (ODBC 日付形式) の場合は、monthlistyearoptmindate、および maxdate パラメータの既定値にも ODBC 形式の既定値が使用されます。現在のロケールの既定値は無視されます。

dformat が -1、1、4、13、または 15 (数値の日付形式) の場合は、現在のロケールの DateSeparator プロパティの値が $ZDATE の月、日、年の区切り文字として使用されます。dformat が 3 の場合は、ODBC の日付区切り文字 (“-”) が使用されます。dformat がそれ以外の値の場合は、空白が日付区切り文字として使用されます。英語での DateSeparator の既定値は “/” で、この区切り文字はすべてのドキュメントで使用されています。

dformat が 11 または 12 (曜日名) で、localeopt=0 または未指定の場合、曜日名の値は現在のロケールのプロパティから得られます。localeopt=1 の場合、曜日名は ODBC ロケールから得られます。ユーザのロケールの既定の曜日名および曜日名の省略形を決定するには、以下の NLS クラス・メソッドを呼び出します。

  WRITE ##class(%SYS.NLS.Format).GetFormatItem("WeekdayName"),!
  WRITE ##class(%SYS.NLS.Format).GetFormatItem("WeekdayAbbr"),!

dformat が 16 または 17 (日本の日付形式) の場合、返される日付形式はロケールの設定に依存しません。日本の日付形式は、任意の Unicode Caché インスタンスから取得できます。8 ビット Caché インスタンスで dformat に 16 または 17 を指定すると、<ERWIDECHAR> エラーが発生します。

dformat が 18、19、20、または 21 (イスラム暦の日付形式) で、localeopt が未指定の場合、パラメータの既定値は現在のロケールの既定値ではなく、イスラム暦の既定値になります。monthlist パラメータの既定値は、ラテン文字で書き直されたアラビア語の月名になります。tformatyearoptmindate、および maxdate パラメータの既定値は、ODBC の既定値になります。日付区切り文字の既定値は、ODBC の既定値や現在のロケールの DateSeparator プロパティ値ではなく、イスラム暦の既定値 (空白) になります。localeopt=0 の場合は、現在のロケール・プロパティの既定値がこれらのパラメータに使用されます。localeopt=1 の場合は、ODBC の既定値がこれらのパラメータに使用されます。

monthlist

区切り文字で区切られた月名または月の省略名の文字列に解決される式です。monthlist にある名前は、現在のロケールの MonthAbbr プロパティに指定されている既定の月の省略形の値、または MonthName に指定されている月名の値を置き換えます。

monthlist は、dformat が 2、5、6、7、9、18、または 20 の場合にのみ有効です。dformat がそれ以外の値の場合、$ZDATEmonthlist を無視します。

monthlist 文字列の形式は、以下のとおりです。

  • 文字列の最初の文字は、区切り文字 (通常はスペース) です。monthlist 内の最初の月名の前と、各月名の間に、同じ区切り文字を置く必要があります。1 文字からなる任意の区切り文字を指定できます。この区切り文字は、返される日付値の月、日、年の間に表示されます。このため、スペースが通常推奨される区切り文字となります。

  • 月名の文字列は、1 月 から 12 月に対応する 12 個の区切り値を含む必要があります。12 より多い、または 12 より少ない月名を指定することは可能ですが、hdate の月に該当する月名がない場合、<ILLEGAL VALUE> エラーが発生します。

monthlist を省略するか、monthlist の値として -1 を指定した場合は、現在のロケールの MonthAbbr または MonthName プロパティで定義されている月名のリストが $ZDATE で使用されます (localeopt=1、または monthlist の既定値が ODBC の月リスト (英語) である場合を除く)。localeopt が未指定で、dformat が 18 または 20 (イスラム暦の日付形式) の場合、monthlist の既定値はイスラム暦の月リスト (ラテン文字で表されたアラビア語の名前) になり、MonthAbbr および MonthName プロパティ値は無視されます。

ユーザのロケールの既定の月名および月名の省略形を指定するには、GetFormatItem()Opens in a new tab NLS クラス・メソッドを呼び出します。

  WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthName"),!
  WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthAbbr"),!

以下の例では、既定のロケールの月名をリストし、このプロセスのロケールを Russian ロケールに変更し、さらにロシア語の月名をリストして、ロシア語の月名で現在の日付を表示します。さらに、既定のロケールを現在のロケールに戻し、再度現在の日付を表示します。今回は既定の月名で表示されます。

   IF $SYSTEM.Version.IsUnicode() {
   WRITE ##class(%SYS.NLS.Format).GetFormatItem("MonthName"),!
   SET fmt=##class(%SYS.NLS.Format).%New("rusw")
   WRITE fmt.MonthName,!
   WRITE $ZDATE($HOROLOG,9),!
   SET fmt=##class(%SYS.NLS.Format).%New()
   WRITE $ZDATE($HOROLOG,9)
   }
   ELSE {WRITE "This example requires a Unicode installation of Caché"}

yearopt

dformat 値が 1、2、4、7、または 15 の場合に、年を 2 桁の値で表示する時間枠を指定する整数コードです。その他すべての dformat 値では、yearopt は無視されます。有効な yearopt 値は、以下のとおりです。

意味
-1 現在のロケールの YearOption プロパティから有効な yearopt 値を取得します。既定値は 0 です。yearopt を指定しない場合は、これが既定の動作になります。
0 (%DATE ユーティリティから構築される) プロセス固有のスライディング・ウィンドウ機能が有効になっていない限り、20 世紀 (1900 年から 1999 年まで) の日付は 2 桁で表し、それ以外の日付は 4 桁で表します。スライディング・ウィンドウが有効の場合、指定範囲内の日付のみ 2 桁の年で表し、それ以外の日付は 4 桁で表します。
1 20 世紀の日付は 2 桁の年、それ以外は 4 桁で表します。
2 すべての日付を 2 桁の年で表します。
3 startwin と (オプションで) endwin に定義した一時的なスライディング・ウィンドウ範囲内に収まる日付を、2 桁の年で表します。それ以外の日付は 4 桁で表します。yearopt=3 の場合、startwinendwin は、$HOROLOG 形式の絶対日付です。
4 すべての日付を 4 桁の年で表します。ODBC の年オプションです。
5 startwin と (オプションで) endwin に定義した一時的なスライディング・ウィンドウ範囲内に収まる日付を、2 桁の年で表します。それ以外の日付は 4 桁で表します。yearopt が 5 の場合、startwin と endwin は相対年になります。
6 2 桁の年で現在の世紀にあるすべての日付を表します。それ以外は 4 桁の年で表します。

ユーザのロケールの既定の年のオプションを決定するには、GetFormatItem()Opens in a new tab NLS クラス・メソッドを呼び出します。

  WRITE ##class(%SYS.NLS.Format).GetFormatItem("YearOption")

yearopt を省略するか、yearopt の値として -1 を指定した場合は、現在のロケールの YearOption プロパティが $ZDATE で使用されます (localeopt=1、または yearopt の既定値が ODBC の年オプションである場合を除く)。localeopt=0 または未指定で、dformat が 18、19、20、または 21 (イスラム暦の日付形式) の場合、yearopt の既定値は ODBC の年オプション (4 桁の年) になります。イスラム暦の日付では、YearOption プロパティの値は無視されます。

startwin

日付を 2 桁の年で表す必要があるスライディング・ウィンドウの最初を指定する数値です。詳細は、パラメータのセクションを参照してください。yearopt が 3 または 5 のとき、startwin を指定する必要があります。startwin は、その他の yearopt 値では無効になります。

yearopt=3 のとき、startwin はスライディング・ウィンドウの最初の日付を示す $HOROLOG 日付形式の絶対日付です。

yearopt = 5 のとき、startwin は、現在の年より前の年数として表される、スライディング・ウィンドウの最初の年を示す数値です。スライディング・ウィンドウは常に、startwin で指定した年の 1 月 1 日から開始します。

endwin

日付を 2 桁の年で表すスライディング・ウィンドウの最後を指定する数値です。yearopt が 3 あるいは 5 のとき、endwin をオプションで指定する必要があります。endwin は、その他の yearopt 値では無効になります。

yearopt=3 のとき、endwin はスライディング・ウィンドウの最後の日付を示す $HOROLOG 日付形式の絶対日付です。

yearopt=5 のとき、endwin は、現在の年から後の年数を示すスライディング・ウィンドウの最後の年を示す数値です。スライディング・ウィンドウは常に、endwin で指定した年の 12 月 31 日で終了します。endwin を指定しない場合、既定は、startwin 以降 100 年後の 12 月 31 日です。

endwin を省略した場合または -1 を指定した場合、スライディング・ウィンドウの有効期限は 100 年間です。endwin 値を -1 とすると特殊なケースになります。endwin の値が -1 よりも大きい場合または小さい場合に erropt が返される場合でも、-1 の場合は必ず日付値が返されます。このため、100 年間のウィンドウを指定する場合は endwin を省略し、その他の場合でも endwin には負の値を指定しないようにすることをお勧めします。

startwinendwin の両方を指定する場合、指定するスライディング・ウィンドウの年数は 100 年以内に収める必要があります。

mindate

有効な日付範囲 (両端を含む) の下限を指定する式です。$HOROLOG 整数日付カウント (例えば、1/1/2013 は 62823 と表される) または $HOROLOG 文字列値の形式で指定できます。$HOROLOG 日付文字列 (“62823,43200” など) の時刻部分は含めることも省略することもできますが、解析されるのは mindate の日付部分のみです。mindate より前の hdate 値を指定すると、<VALUE OUT OF RANGE> エラーが発生します。

mindate に指定できる値は以下のとおりです。

  • 正整数 :通常は、mindate には、1840 年 12 月 31 日より後の最も早い有効日付を設定するための正の整数を指定します。例えば、mindate に 21550 を指定すると、1900 年 1 月 1 日が最も早い有効日付として設定されます。有効な最大値は 2980013 です (9999 年 12 月 31 日)。

  • 0 : 1840 年 12 月 31 日を最も早い日付として指定します。これは DateMinimum プロパティの既定値です。

  • -2 以下の負の整数 : 1840 年 12 月 31 日から遡ってカウントする最も早い日付を指定します。例えば、mindate に -14974 を指定すると、1800 年 1 月 1 日が最も早い有効日付として設定されます。負の mindate 値が有効となるのは、現在のロケールの DateMinimum プロパティがその値以下の負の整数に設定されている場合のみです。有効な最小値は -672045 です。

  • mindate を省略するか、-1 を指定した場合は、現在のロケールの DateMinimum プロパティ値が既定値になります (localeopt=1 または mindate の既定値が 0 の場合を除く)。localeopt が未指定で dformat=3 の場合、mindate の既定値は 0 になります。localeopt が未指定で dformat が 18、19、20、または 21 (イスラム暦の日付形式) の場合、mindate の既定値は 0 になります。

DateMinimum プロパティは、以下のように取得および設定できます。

  SET min=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")
  WRITE "initial DateMinimum value is ",min,!
Permit18thCenturyDates
  SET x=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",-51498)
  SET newmin=##class(%SYS.NLS.Format).GetFormatItem("DateMinimum")
  WRITE "set DateMinimum value is ",newmin,!!
RestrictTo19thCenturyDates
  WRITE $ZDATE(-13000,1,,,,,-14974),!!
ResetDateMinimumToDefault
  SET oldmin=##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",min)
  WRITE "reset DateMinimum value from ",oldmin," to ",min 

mindate を指定する際は、maxdate を指定しても指定しなくてもかまいません。maxdate より大きい mindate を指定すると、<ILLEGAL VALUE> エラーが発生します。

ODBC 日付形式 (dformat 3)

DateMinimum プロパティの適用は、localeopt 設定によって管理されます。localeopt=1 (dformat=3 の場合の既定) の場合、現在のロケール設定に関係なく、日付の最小値は 0 になります。したがって、ODBC 形式 (dformat=3) では、以下を使用して 1840 年 12 月 31 日よりも前の日付を指定できます。

  • 指定した日付よりも前の mindate を指定します。

      WRITE $ZDATE(-30,3,,,,,-365)
  • 指定した日付よりも前の DateMinimum プロパティ値を指定し、localeopt=0 を設定します。

      DO ##class(%SYS.NLS.Format).SetFormatItem("DateMinimum",-365)
      WRITE $ZDATE(-30,3,,,,,,,,0)

maxdate

有効な日付範囲 (両端を含む) の上限を指定する式です。$HOROLOG 整数日付カウント (例えば、1/1/2100 は 94599 と表される) または $HOROLOG 文字列値の形式で指定できます。$HOROLOG 日付 (“94599,43200” など) の時刻部分は含めることも省略することもできますが、解析されるのは maxdate の日付部分のみです。

maxdate を省略するか、または -1 を指定すると、現在のロケールの DateMaximum プロパティから日付の上限が取得されます。既定値は、$HOROLOG の日付部分で許容される最大値である、2980013 (西暦 9999 年 12 月 31 日に対応) です。ただし、DateMaximum プロパティの適用は localeopt の設定によって制御されます。localeopt=1 (dformat=3 の場合の既定値) の場合、現在のロケール設定に関係なく、日付の既定最大値は ODBC の値 (2980013) になります。イスラム暦の日付形式でも ODBC の既定値が使用されます。タイ日付形式 (dformat=13) の最大日付は $HOROLOG 2781687 で、これは BE 9999 年 12 月 31 日に対応します。

maxdate より大きい hdate を指定すると、<VALUE OUT OF RANGE> エラーが発生します。

2980013 より大きい maxdate を指定すると、<ILLEGAL VALUE> エラーが発生します。

maxdate を指定する際は、mindate を指定しても指定しなくてもかまいません。mindate より小さい maxdate を指定すると、<ILLEGAL VALUE> エラーが発生します。

erropt

このパラメータに値を指定すると、hdate 値が無効または範囲外の場合に生じるエラーが抑制されます。$ZDATE 関数は、<ILLEGAL VALUE> または <VALUE OUT OF RANGE> エラーを生成する代わりに erropt 値を返します。

  • 検証:Caché は、hdate に対してキャノニック数値変換を実行します。hdate 文字列の解析は、数値以外の最初の文字で停止します。したがって、64687AD などの hdate 文字列は、64687 と同じです。数値以外の日付 (NULL 文字列を含む) は 0 に評価されます。したがって、hdate が空の文字列の場合は、$HOROLOG の最初の日付 (12/31/1840) が返されます。ただし、hdate が整数に評価されない (ゼロ以外の小数を含む) 場合、<ILLEGAL VALUE> エラーが発生します。

  • 範囲:hdate は常に mindate から maxdate までの範囲内の整数に評価される必要があります。既定では、2980013 を超える日付値または 0 未満の日付値は <VALUE OUT OF RANGE> エラーを生成します。mindate を負の数値に設定すると、1840 年 12 月 31 日より前の有効な日付の範囲を拡張できます。ただし、dformat 18、19、20、または 21 (ヒジュラ・イスラム暦) の日付の場合、-445031 より前の日付は、mindate がより早い日付に設定されていても、<ILLEGAL VALUE> エラーを生成します。

erropt パラメータは、hdate の無効な値または範囲外の値が原因で生成されるエラーのみを抑制します。他のパラメータの無効な値、あるいは範囲外の値が原因で発生したエラーについては、erropt が指定されているかどうかに関係なく、常にエラーが生成されます。例えば、$ZDATE で endwinstartwin より前になるスライディング・ウィンドウを指定すると、常に <ILLEGAL VALUE> エラーが発生します。同様に、maxdatemindate より小さい場合、<ILLEGAL VALUE> エラーが発生します。

ZDateNull を使用した無効な日付の処理

hdate に無効な値が指定された際の $ZDATE の動作は、ZDateNull を使用して設定できます。現在のプロセスに対するこの動作を設定するには、%SYSTEM.ProcessOpens in a new tab クラスの ZDateNull()Opens in a new tab メソッドを使用します。システム全体の既定の動作は、Config.MiscellaneousOpens in a new tab クラスの ZDateNullOpens in a new tab プロパティで設定できます。$ZDATE はエラーを発行するか、または NULL 値を返すことができます。

システム全体の既定の振る舞いは構成可能です。管理ポータルに進み、システム, 構成, 互換性設定 を選択します。[ZDateNull] の現在の設定を表示して編集します。既定は “false” で、これは $ZDATE がエラーを返すことを意味します。

localeopt

このブーリアン・パラメータには、ロケールで指定されるパラメータ dformatmonthlistyearoptmindate、および maxdate の既定値のソースとして、ユーザの現在のロケール定義または ODBC のロケール定義が指定されます。

  • localeopt=0 の場合は、これらすべてのパラメータで現在のロケール定義の既定値が使用されます。

  • localeopt=1 の場合は、これらすべてのパラメータで ODBC の既定値が使用されます。

  • localeopt が未指定の場合は、dformat パラメータによってこれらのパラメータの既定値が決定されます。dformat=3 の場合は、ODBC の既定値が使用されます。dformat が 18、19、20、または 21 の場合は、現在のロケール定義に関係なく、イスラム暦の日付形式の既定値が使用されます。dformat がそれ以外の値の場合は、現在のロケール定義の既定値が使用されます。詳細は、"dformat" の説明を参照してください。

ODBC ロケールは変更できません。これは、各国語サポート (NLS) の選択が異なる Caché プロセス間で移植できる日付文字列をフォーマットするために使用されます。localeopt=1 の場合、ODBC ロケールの日付定義は以下のとおりです。

  • 日付形式の既定は 3 です。したがって、dformat が未定義または -1 の場合は、日付形式 3 が使用されます。

  • 日付の区切り文字の既定は "/" です。ただし、日付形式の既定は 3 で、これは日付の区切り文字として "-" を常に使用します。

  • 年のオプションの既定は 4 桁です。

  • 日付の最小値は 0 で、最大値は 2980013 ($HOROLOG の日数カウント) です。

  • 英語の月名、月の省略形、曜日名、および曜日の省略形が使用されます。

日付形式の例

以下の例は、現在の日付に対して、さまざまな dformat 形式をどのように $ZDATE が返すかを示しています。yearopt は既定値を取ります。日付の区切り文字、および月と曜日の名前とその省略形はロケールに依存します。この例では、以下に示す現在のユーザのロケール定義を使用しています。

   WRITE $ZDATE($HOROLOG),  "   default date format",!
   WRITE $ZDATE($HOROLOG,1),"   1=American numeric format",!
   WRITE $ZDATE($HOROLOG,2),"   2=Month abbreviation format",!
   WRITE $ZDATE($HOROLOG,3),"   3=ODBC numeric format",!
   WRITE $ZDATE($HOROLOG,4),"   4=European numeric format",!
   WRITE $ZDATE($HOROLOG,5),"   5=Month abbreviation format",!
   WRITE $ZDATE($HOROLOG,6),"   6=Month abbreviation format",!
   WRITE $ZDATE($HOROLOG,7),"   7=Month abbreviation format",!
   WRITE $ZDATE($HOROLOG,8),"   8=Numeric format no spaces",!
   WRITE $ZDATE($HOROLOG,9),"   9=Month name format",!
   WRITE $ZDATE($HOROLOG,10),"  10=Day-of-week format",!
   WRITE $ZDATE($HOROLOG,11),"  11=Day abbreviation format",!
   WRITE $ZDATE($HOROLOG,12),"  12=Day name format",!
   WRITE $ZDATE($HOROLOG,13),"  13=Thai numeric format",!
   WRITE $ZDATE($HOROLOG,14),"  14=Day-of-year format",!
   WRITE $ZDATE($HOROLOG,15),"  15=European numeric format",!
   WRITE $ZDATE($HOROLOG,16),"  16=Japanese date format",!
   WRITE $ZDATE($HOROLOG,17),"  17=Japanese date format with spaces"

以下の例は、現在のユーザのロケールを既定にしたときのロケールの日付と localeopt=1 が ODBC ロケール定義を有効化したときの日付とを比較します。この例をより興味深いものにするために、現在のユーザのロケールをフランス語に設定します。

  SET fmt=##class(%SYS.NLS.Format).%New("fraw")
  WRITE "default: local=",$ZDATE($HOROLOG),"   ODBC=",$ZDATE($HOROLOG,,,,,,,,,1),!
  WRITE "-1:      local=",$ZDATE($HOROLOG,-1),"   ODBC=",$ZDATE($HOROLOG,-1,,,,,,,,1),!!
  FOR x=1:1:17 {
    WRITE x,": local=",$ZDATE($HOROLOG,x),"   ODBC=",$ZDATE($HOROLOG,x,,,,,,,,1),! }

2 桁の年のスライディング・ウィンドウの例

明示的なスライディング・ウィンドウの使用方法を示すために、以下の関数呼び出しを 1997 年に入力したと仮定します。59461 の hdate に相当する日付は、2003 年 10 月 19 日です。dformat に 1 を指定すると、2 桁または 4 桁の年が返されます。yearopt に 5 を指定すると、4 桁の年のスライディング・ウィンドウが指定されます。yearopt 設定に従い、startwin および endwin が、現在の年 (この場合 1997 年) から相対的に、加算および減算によって計算されます。

   WRITE $ZDATE(59461,1,,5,90,10)

2 桁で年を表示するスライディング・ウィンドウは、1/1/1907 から12/31/2006 までの範囲に指定されるため、Caché は 10/19/03 のように日付を表示します。

日付範囲の例

以下の例は、mindatemaxdate を使用して、妥当な誕生日をテストします。maxdate は、誕生日が未来になることはないと想定し、mindate は、リストされた人で 124 歳を超える人はいないと想定します。日付は、$HOROLOG 形式で指定されます。

PlausibleBirthdate
   SET bdateh(1)=62142
   SET bdateh(2)=16800
   SET bdateh(3)=70000
   DO $SYSTEM.Process.ZDateNull(1)
   SET maxdate=$PIECE($HOROLOG,",",1)+1
   SET mindate=maxdate-(365.25*124)
   FOR x=1:1:3 {
      SET bdate=$ZDATE(bdateh(x),,,,,,mindate,maxdate)
      IF bdate="" {WRITE "Birth date ",bdateh(x)," is out of range",!}
      ELSE {WRITE "Birth date ",bdateh(x)," is ",bdate,!}
   }

上記の 2 つの $ZDATE 入力値が誕生日テストの日付範囲の外側になります。つまり、16800 (12/30/1886) は 124 年より前で、70000 (08/26/2032) は未来です。既定では、このように $ZDATE を呼び出すと、<VALUE OUT OF RANGE> エラーが発生しますが、ZDateNull(1) が設定されているため、空の文字列 ("") が返されます。

メモ

$ZDATE で無効な値

以下の状況では、<FUNCTION> エラーが発生します。

  • 無効な dformat コード (-1 未満の整数値、17 より大きな整数値、または整数以外の値) を指定した場合。

  • yearopt が 3 あるいは 5 の場合に、startwin 値を指定しない場合。

以下の状況で、<ILLEGAL VALUE> エラーが発生します。

  • hdate に無効な値を指定し、erropt 値または ZDateNull (以下で説明します) を設定しない場合。

  • 指定された月数が monthlist の値よりも大きい場合。

  • maxdatemindate よりも小さい場合。

  • endwinstartwin よりも小さい場合。

  • startwinendwin で、期間が 100 年より長い一時的なスライディング・ウィンドウが指定された場合。

以下の状況では、<VALUE OUT OF RANGE> エラーが発生します。

  • 有効な日付範囲外の hdate を指定した場合。標準 Caché では 0 から 298013、ISM 互換の Caché では 1 から 94232 が有効な日付範囲です。%SYSTEM.ProcessOpens in a new tab クラスの ZDateNull()Opens in a new tab メソッドを使用して、現在のプロセスに対する日付範囲と無効な日付の動作を設定できます。

  • maxdatemindate に対して想定される値によって定義された範囲外にある、範囲内にあれば有効であった日付を指定し、erropt 値を指定しない場合。

ユーティリティの代わりに使用する $ZDATE

$ZDATE 関数と日付ユーティリティのいずれかを選択する必要がある場合、以下の点に注意してください。

  • %DO あるいは %D ユーティリティにある既存のエントリ・ポイントの代わりに $ZDATE 関数を使用できます。

  • INT ^%D を呼び出さずに、$ZDATE($HOROLOG,7) を直接呼び出すことができます。これにより、現在の日付が "Mmm DD [YY]YY" 形式で表示されます。

  • $ZDATEH$ZDATE は、%DATE%DI%DO のエントリ・ポイントの呼び出しよりも高速に処理できます。

関連項目

FeedbackOpens in a new tab