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?

$NOW

現在のプロセスのローカルの日付と時刻を、秒の小数部を含めて返します。

Synopsis

$NOW(tzmins)

パラメータ

tzmins

オプション — グリニッジ子午線を基準とした目的のタイム・ゾーン・オフセットを指定する正または負の整数値 (分)。0 は、グリニッジ子午線に相当します。正の整数は、グリニッジの西側のタイム・ゾーンに相当し、負の整数はグリニッジの東側のタイム・ゾーンに相当します。例えば、300 は グリニッジの 5 時間 (300 分) 西側の米国東部標準時に相当します。許可される値の範囲は -1440 ~1440 です。この範囲を超えると、<ILLEGAL VALUE> エラーが発生します。

tzmins を省略すると、$NOW 関数は $ZTIMEZONE 特殊関数の値に基づいてローカルの日付と時刻を返します。$NOW 関数がサポートする $ZTIMEZONE 値の範囲は -1440 ~1440 です。値がこの範囲を超えると、<ILLEGAL VALUE> エラーが発生します。

説明

$NOW は以下の値を返すことができます。

  • 現在のプロセスのローカルの日付と時刻 (秒の小数部を含む)

  • 現在のプロセスの、指定されたタイム・ゾーンのローカルの日付と時刻 (秒の小数部を含む)

$NOW 関数は、コンマで区切られた 2 つの数値から成る文字列を返します。最初の数値は、現在のローカル日付を表す整数です。2 番目は、現在のローカル時刻を表す小数です。これらの値はカウンタで、ユーザが読み取れる日付と時刻ではありません。

$NOW は、Caché ストレージ ($HOROLOG) 形式の日付と時刻 (秒の小数部を含む) を返します。$NOW は現在のローカルの日付と時刻を ddddd,sssss.ffffff という形式で返します。

最初の整数 (ddddd) は 1840 年 12 月 31 日から起算した日数です。1 は 1841 年 1 月 1 日を表します。この日付の整数の最大値は 2980013 です。これは 9999 年 12 月 31 日に相当します。

2 番目の数値 (sssss.ffffff) は、その日の午前 0 時 00 分からの秒数 (および秒の小数部) を表します。Caché は、sssss フィールドを 0 から 86399 秒までインクリメントします。深夜 12 時に 86399 に達すると、Caché は sssss フィールドを 0 にリセットして、日付フィールドを 1 つインクリメントします。深夜 12 時を過ぎて 1 秒以内の秒数は 0.ffffff (例えば、0.123) で表されます。この数値は ObjectScript キャノニック形式 (例えば、.123) ではないため、これらの値の文字列並べ替え順序に影響を及ぼします。並べ替え操作を実行する前に、数値を強制的にキャノニック形式に変換するプラス記号 (+) を先頭に追加できます。ffffff の小数桁数は、現在のオペレーティング・システムでサポートされている最大精度の桁数です。Windows の秒の小数部については、以下を参照してください。

$NOW 関数は、パラメータ値を指定しても、指定しなくても呼び出せます。括弧は必須です。

パラメータ値を指定しないと、$NOW は現在のプロセスの、現在のローカルの日付と時刻を返します。これは、$ZTIMEZONE 特殊変数に設定された値からローカル・タイム・ゾーンを決定します。$ZTIMEZONE を設定すると $NOW の時刻部分が変更され、またこの変更によって $NOW の日付部分も変更されることがあります。

Caution:

ローカル時刻値 $NOW は、ローカルな時刻に対応しない場合があります。$NOW$ZTIMEZONE 値を使用してローカル時刻を決定します。$ZTIMEZONE は 1 年を通して連続的で、サマータイム (DST) などのローカル時刻調整には対応していません。

UTC 時刻からのオフセットは、グリニッジ子午線からのタイム・ゾーンのカウントを使用して計算されます。これは、ローカル時刻とローカル・グリニッジ時刻の比較ではありません。グリニッジ標準時 (GMT) とは紛らわしい用語であり、グリニッジのローカル時刻は、冬の間は UTC と同じで、夏の間は、UTC と 1 時間違います。これは、英国夏時間と呼ばれるローカル時刻の変更が適用されるためです。$NOW では、ローカル時刻の変更がすべて無視されます。

また、$NOW はシステム時計と時刻値を再同期するため、$NOW とその他の Caché 時間関数および特殊変数には、若干の差異が生じる場合があります。この差異は 0.05 秒以内ですが、この差異の範囲内で比較した際に、誤解を与える結果が生じる場合があります。例えば、WRITE $NOW(),!,$HOROLOG では以下のような結果が生じます。

61438,38794.002085
61438,38793

この異常は、再同期での 0.05 秒の差異と、$HOROLOG での秒の小数部の切り捨てが重なって生じます。

パラメータ値のある $NOW は、tzmins で指定されたタイム・ゾーンに対応する時刻と日付を返します。$ZTIMEZONE の値は無視されます。

時間関数の比較

現在の日付と時刻は、さまざまな方法で返すことができますが、その違いを以下に示します。

  • $NOW は、現在のプロセスのローカルな日付と時刻を返します。$NOW は、日付と時刻を Caché ストレージ形式で返します。これには、秒の小数部が含まれます。小数桁数は、現在のオペレーティング・システムでサポートされている最大精度の桁数です。

    • $NOW は、$ZTIMEZONE 特殊変数の値からローカル・タイム・ゾーンを決定します。ローカル時刻は、サマータイムなどのローカル時刻調整に合わせて調整されません。したがって、ローカルな時刻に対応しない場合があります。

    • $NOW(tzmins) は、指定された tzmins タイム・ゾーン・パラメータに対応する時刻と日付を返します。$ZTIMEZONE の値は無視されます。

  • $HOROLOG には、ローカル調整された日付と時刻が Caché ストレージ形式で格納されます。ローカル・タイム・ゾーンは、$ZTIMEZONE 特殊変数の現在の値で決まり、サマータイムなどのローカル時刻調整に合わせて調整されます。これは、整数秒のみを返し、小数部分は切り捨てられます。

  • $ZTIMESTAMP には、秒の小数部を含む UTC (協定世界時) の日付と時刻が Caché ストレージ形式で格納されます。秒の小数部は、Windows システムでは有効桁数 3 桁で、UNIX® システムでは有効桁数 6 桁で表されます。このため、$NOW(0) は、$ZTIMESTAMP よりも大きい秒の小数部の精度で UTC 時刻を返す場合があります。

現在の日付と時刻を返すこれらの方法はいずれも、廃止された $ZUTIL(188) 関数の代わりとはなりません。この関数は、ローカル時刻と秒の小数部の両方を調整して、ローカルの日付と時刻を示していました。

Windows でのマイクロ秒

一般に、Windows システム上でのマイクロ秒の精度は、他のプラットフォームよりも劣ります。これは、QueryPerformanceCounter() Windows ライブラリ・ルーチンの制限に起因します。Caché はマイクロ秒を、QueryPerformanceCounter() により計算された結果と、他の日付/時刻関数に使用されるシステム時計とを比較して決定します。システム時計の精度は、最高でも 1 ミリ秒です (Windows を実行しているハードウェアに応じて、精度は通常、1 から 20 ミリ秒の間になります)。$NOW マイクロ秒精度のクロックが、ミリ秒精度のクロックと 50 ミリ秒を超えた誤差がある場合、Caché はマイクロ秒精度のクロックを進めるか遅らせるかして、ミリ秒精度のクロックにより正確に (しかし精度を落として) 合わせます。

この理由から、Windows 上では、$NOW 関数 (および従来の $ZUTIL(188) 関数) は、数秒以内のごく短時間におけるマイクロ秒精度の時間間隔の測定に適しています。複数の CPU コアがあるシステム上では、各コアに対する Caché Windows プロセスは、個々のプロセスにローカルにミリ秒単位の調整を行います。これはつまり、異なる Caché CPU プロセスについて返された複数の $NOW 値は、一致しない可能性があるということです。CPU プロセス間のこの相違は、Windows がマルチコア CPU チップ上でホストされる仮想マシンで実行している場合にはさらに顕著になります。

日付と時刻の分割

$NOW の日付部分または時刻部分のみを取得するには、区切り文字としてコンマを指定して、$PIECE 関数を使用します。

   SET dateval=$PIECE($NOW(),",",1)
   SET timeval=$PIECE($NOW(),",",2)
   WRITE !,"Date and time: ",$NOW()
   WRITE !,"Date only: ",dateval
   WRITE !,"Time only: ",timeval

日付の設定

$NOW および $ZTIMESTAMP によって返される値は、%SYSTEM.ProcessOpens in a new tab クラスの FixedDate() メソッドを使用して設定することはできません。

$HOROLOG に含まれる値は、%SYSTEM.ProcessOpens in a new tab クラスの FixedDate()Opens in a new tab メソッドを使用して、現在のプロセスのユーザ指定の日付に設定することができます。

以下の例では、現在のローカルの日付と時刻を返す 2 つの方法を示します。

   WRITE $ZDATETIME($NOW(),1,1,3)," $NOW() date & time",!
   WRITE $ZDATETIME($HOROLOG,1,1,3)," $HOROLOG date & time"

$HOROLOG によって、サマータイムなどのローカル時刻調整が行われます。$NOW ではローカル時刻調整に合わせた調整を行いません。

以下の例は $ZDATE を使用して、$NOW の日付フィールドを日付形式に変換します。

   WRITE $ZDATE($PIECE($NOW(),",",1))

04/29/2009 の形式で値を返します。

次の例では、$NOW の時刻部分が 12 時間 (a.m. または p.m.) 表示の時間:分:秒.ffff 形式の時刻に変換されます。

CLOCKTIME    
  NEW
  SET Time=$PIECE($NOW(),",",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

関連項目

FeedbackOpens in a new tab