整数カウンタとしての、現在の日付と時刻を含みます。
Synopsis
$HOROLOG は、コンマで区切られた 2 つの整数値から成る文字列を含みます。これらの 2 つの整数は、現在の日付と時刻を表します。これらの整数はカウンタで、外部でユーザが読み込める日付と時刻ではありません。
$HOROLOG は、次の形式で現在の日付と時刻を返します。
最初の整数は、1840 年 12 月 31 日からの経過日数です。つまり、日 1 は 1841 年 1 月 1 日です。Caché は任意の開始ポイントからのカウンタを使用して日付を表すので、2000 年問題の影響は受けません。この日付整数の最大値は 2980013 で、9999 年 12 月 31 に当たります。
2 番目の整数は、その日の午前 0 時 00 分からの秒数を表します。システムは、0 から 86399 秒で時間フィールドをインクリメントします。深夜 12 時に 86399 に到達すると、システムは時間フィールドを 0 にリセットしてから、日付フィールドを 1 つインクリメントします。
現在の日付と時刻は、さまざまな方法で返すことができますが、その違いを以下に示します。
-
$HOROLOG には、ローカル調整された日付と時刻が Caché ストレージ形式で格納されます。秒の小数部は格納されません。
$HOROLOG による秒の小数部の変換方法は、オペレーティング・システム・プラットフォームによって異なります。Windows では、小数部が整数秒に切り上げられます。UNIX では、小数部が切り捨てられます。
-
-
$ZTIMESTAMP には、秒の小数部を含む UTC (グリニッジ標準) の日付と時刻が Caché ストレージ (
$HOROLOG) 形式で格納されます。秒の小数部は、Windows システムでは 3 桁で、UNIX システムでは 6 桁で表されます。
以下のように、システム・メソッドを呼び出すことで、現在の同じ日付と時刻を取得することができます。
WRITE $SYSTEM.SYS.Horolog()
SET dateint=$PIECE($HOROLOG,",",1)
SET timeint=$PIECE($HOROLOG,",",2)
WRITE !,"Date and time: ",$HOROLOG
WRITE !,"Date only: ",dateint
WRITE !,"Time only: ",timeint
$HOROLOG 値の日付部分のみを取得する場合は、次のプログラミング方法を使用することもできます。
SET dateint=+$HOROLOG
WRITE !,"Date and time: ",$HOROLOG
WRITE !,"Date only: ",dateint
プラス記号 (+) によって、
$HOROLOG 文字列が数値として解析されます。数値以外の文字 (コンマ) が検出されると、残りの文字列は切り捨てられ、数値部分が返されます。これが、文字列の日付整数部分です。
この特殊変数は、
SET コマンドを使用して変更することはできません。変更を試みると、<SYNTAX> エラーが返されます。
WRITE !,$ZUTIL(71,12345) // set $HOROLOG date
SET x=$HOROLOG
SET y=$ZUTIL(188)
SET z=$ZTIMESTAMP
WRITE !,x," which is ",$ZDATETIME(x,1,1,9) // changed date
WRITE !,y," which is ",$ZDATETIME(y,1,1,9) // no date change
WRITE !,z," which is ",$ZDATETIME(z,1,1,9) // no date change
$HOROLOG では、システム時計を参照して午前 0 時からの秒数を計算します。このため、サマータイムの開始や終了時など、ローカル時刻調整しきい値を交差したときにシステム時計が自動的にリセットされると、
$HOROLOG の時刻値も該当する秒数だけ前または後に突然変更されます。したがって、2 つの
$HOROLOG 時刻値を比較した場合、2 つの値の間の期間にローカル時刻調整しきい値が含まれていると、予期しない結果が生じることがあります。
$HOROLOG を使用して、1840 年から 9999 年までの範囲外の日付を直接表すことはできません。ただし、SQL のユリウス日付機能を使用することで、この範囲外の日付を表すことができます。SQL のユリウス日付関数
TO_DATE および
TO_CHAR は符号なし整数を使用し、これを紀元前 4711 年 (BCE) からカウントした日付としてフォーマットします。
$PIECE 関数を使用すると、次の例のように、
$HOROLOG から日付整数を抽出し、これらのユリウス日付関数のいずれかへの入力としてその値を使用することができます。現在の日付を表す
$HOROLOG 整数は、大幅に異なるユリウス日付値を示すことに注意してください。例えば、2004 年の
$HOROLOG 日付は、紀元前 4548 年のユリウス日付を示します。
SET x=$PIECE($HOROLOG,",",1)
&sql(SELECT TO_DATE(:x,'J') INTO :y
FROM Sample.Person)
WRITE !,"Julian date= ",y
WRITE $ZDATE($PIECE($HOROLOG,",",1))
次の例では、
$HOROLOG の時刻部分が 12 時間 (a.m. または p.m.) 表示の時間:分:秒形式の時刻に変換されます。
CLOCKTIME
NEW
SET Time=$PIECE($HOROLOG,",",2)
SET Sec=Time#60
SET Totmin=Time\60
SET Min=Totmin#60
SET Milhour=Totmin\60
IF Milhour=12 { SET Hour=12,Meridian=" pm" }
ELSEIF Milhour>12 { SET Hour=Milhour-12,Meridian=" pm" }
ELSE { SET Hour=Milhour,Meridian=" am" }
WRITE !,Hour,":",Min,":",Sec,Meridian
QUIT