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?

$ZTIMESTAMP

UTC (Coordinated Universal Time) 形式で、現在の日付と時刻を含みます。

Synopsis

$ZTIMESTAMP
$ZTS

概要

$ZTIMESTAMP には、現在の日付と時刻が UTC (Coordinated Universal Time) 値として含まれます。UTC は、時刻と日付の世界標準です。この値は、ローカル時刻 (および日付) の値と異なる場合がほとんどです。

$ZTIMESTAMP は、日付と時刻を次の形式の文字列として表します。

ddddd,sssss.fff

ddddd は、1840 年 12 月 31 日からの経過日数を示す整数です。sssss は、現在の日付の午前 0 時からの経過秒数を示す整数です。fff は、秒の小数部を示す可変桁数です。この形式は $HOROLOG と似ていますが、$HOROLOG には秒の小数部は含まれません。

現在の日付と時間 (UTC) が以下のようになると仮定します。

2011-03-26 15:17:27.984

そのとき、$ZTIMESTAMP は以下の値を持ちます。

62176,55047.984

$ZTIMESTAMP は、タイム・ゾーンとは独立した UTC (Coordinated Universal Time) を報告します そのため、ローカル時間帯に関係なく、一様に時間を記録するタイムスタンプとして $ZTIMESTAMP を使用することができます。これは、ローカル時刻値とローカル日付値の両方と異なる場合があります。

$ZTIMESTAMP の時刻値は、秒数とその小数部で時刻をカウントする 10 進数値です。秒以下の桁数は、0 から 9 桁で、コンピュータの時刻クロックの有効桁数によって決定します。Windows システムでは、小数部分の有効桁数は 3 桁で、UNIX® システムでは 6 桁です。$ZTIMESTAMP は末尾の 0 や、この小数部での末尾の小数点を抑制します。深夜 12 時を過ぎて 1 秒以内の秒数は 0.fff (例えば、0.123) で表されます。この数値は ObjectScript キャノニック形式 (例えば、.123) ではないため、これらの値の文字列並べ替え順序に影響を及ぼします。並べ替え操作を実行する前に、数値を強制的にキャノニック形式に変換するプラス記号 (+) を先頭に追加できます。

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

  • $ZTIMESTAMP には、秒の小数部を含む UTC の日付と時刻が Caché ストレージ ($HOROLOG) 形式で格納されます。秒の小数部は、Windows システムでは有効桁数 3 桁で、UNIX® システムでは有効桁数 6 桁で表されます。

  • $NOW は、現在のプロセスのローカル日付とローカル時刻を返します。ローカル時刻調整 (サマータイムなど) は適用されません。パラメータ値のない $NOW は、$ZTIMEZONE 特殊変数の値からローカル・タイム・ゾーンを決定します。パラメータ値のある $NOW は、指定されたタイム・ゾーン・パラメータに対応する時刻と日付を返します。$NOW(0) は、UTC による日付と時刻を返します。$ZTIMEZONE の値は無視されます。$NOW は、Caché ストレージ ($HOROLOG) 形式で日付と時刻を返します。これには、秒の小数部が含まれます。小数桁数は、現在のオペレーティング・システムでサポートされている最大精度の桁数です。このため、$NOW(0) は、$ZTIMESTAMP よりも大きい秒の小数部の精度で UTC 時刻を返す場合があります。

  • $HOROLOG には、ローカル調整された日付と時刻が Caché ストレージ形式で格納されます。秒の小数部は記録されません。$HOROLOG による秒の小数部の処理方法は、オペレーティング・システム・プラットフォームによって異なります。Windows では、小数部はすべて切り上げられます。UNIX® では、小数部は切り捨てられます。

Note:

ローカル時刻と UTC 時刻を比較する際には注意が必要です。

  • UTC 時刻をローカル時刻に変換するための推奨される方法は、$ZDATETIMEH(utc,-3) 関数を使用することです。この関数によって、ローカル時刻調整が調整されます。

  • $ZTIMEZONE * 60 の値を加算または減算するだけで、ローカル時刻と UTC 時刻を相互変換することはできません。これは、多くの場合、ローカル時刻調整 (季節によってローカル時刻を 1 時間調整するサマータイムなど) に合わせてローカル時刻が調整されるためです。このようなローカル時刻調整は、$ZTIMEZONE には反映されません。

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

  • UTC からのタイムゾーン・オフセットとローカル時刻調整 (季節によるサマータイムへの移行など) の両方が、日付と時刻に影響します。ローカル時刻から UTC 時刻への変換 (またはその逆の変換) を行うと、日付と時刻の両方が変更される場合があります。

この特殊変数は、SET コマンドを使用して変更することはできません。変更を試みると、<SYNTAX> エラーが返されます。

協定世界時の変換

次の例のように、tformat 値 7 または 8 を指定して $ZDATETIME および $ZDATETIMEH 関数を使用することで、ローカル時刻情報を UTC として表すことができます。

   WRITE !,$ZDATETIME($ZTIMESTAMP,1,1,2)
   WRITE !,$ZDATETIME($HOROLOG,1,7,2)
   WRITE !,$ZDATETIME($HOROLOG,1,8,2)
   WRITE !,$ZDATETIME($NOW(),1,7,2)
   WRITE !,$ZDATETIME($NOW(),1,8,2)

上記の $ZDATETIME 関数はすべて、現在の時刻をローカル時刻ではなく UTC として返します。ローカル時刻からのこれらの時刻値変換は、$NOW がローカル時刻調整を行わないため、異なる場合があります。$ZTIMESTAMP および $HOROLOG は、ローカル時刻調整を行い、必要に応じてこの調整に従って日付を調整します。$ZTIMESTAMP の表示値と、tformat 値 7 または 8 で変換された表示値は同一ではありません。tformat 値 7 および 8 によって、時刻値の前に文字 “T”、後に文字 “Z” が挿入されます。また、$HOROLOG 時刻には 1 秒以下の秒数が含まれないので、上の例の precision 2 によって小数部にゼロが埋め込まれます。

以下の構文形式のいずれかを使用して TimeStamp()Opens in a new tab クラス・メソッドを呼び出すことで、$ZTIMESTAMP と同じタイム・スタンプ情報を取得することができます。

   WRITE !,$SYSTEM.SYS.TimeStamp()
   WRITE !,##class(%SYSTEM.SYS).TimeStamp()

詳細は、このドキュメントの "$SYSTEM" 特殊変数と、"インターシステムズ・クラス・リファレンス" の %SYSTEM.SYSOpens in a new tab クラスを参照してください。

以下の例では、$ZTIMESTAMP の値をローカル時刻に変換し、それを $NOW()$HOROLOG の 2 つのローカル時刻表現と比較します。

   SET stamp=$ZTIMESTAMP,clock=$HOROLOG,miliclock=$NOW()
   WRITE !,"local date and time: ",$ZDATETIME(clock,1,1,2)
   WRITE !,"local date and time: ",$ZDATETIME(miliclock,1,1,2)
   WRITE !,"UTC date and time:   ",$ZDATETIME(stamp,1,1,2)
   IF $PIECE(stamp,",",2) = $PIECE(clock,",",2) {
      WRITE !,"Local time is UTC time" }
   ELSEIF $PIECE(stamp,",") '= $PIECE(clock,",") {
     WRITE !,"Time difference affects date" }
   ELSE {
         SET localutc=$ZDATETIMEH(stamp,-3)
         WRITE !,"UTC converted to local: ",$ZDATETIME(localutc,1,1,2)
   }
   QUIT

次の例は、$ZTIMESTAMP$HOROLOG によって返される値を比較し、$ZTIMESTAMP の時刻部分がどのように変換されるかを示します (この簡単な例では、サマータイムなどのローカル時刻調整に合わせて 1 つの調整のみが行われます。その他のタイプのローカル時刻調整では、clocksecs および stampsecs に矛盾する値が含まれることがあります)。

   SET stamp=$ZTIMESTAMP,clock=$HOROLOG
   WRITE !,"local date and time: ",$ZDATETIME(clock,1,1,2)
   WRITE !,"UTC date and time:   ",$ZDATETIME(stamp,1,1,2)
   IF $PIECE(stamp,",") '= $PIECE(clock,",") {
     WRITE !,"Time difference affects date" }
   SET clocksecs=$EXTRACT(clock,7,11)
   SET stampsecs=$EXTRACT(stamp,7,11)-($ZTIMEZONE*60)
   IF clocksecs=stampsecs {
      WRITE !,"No local time variant" 
      WRITE !,"Local time is timezone time" }
   ELSE {
         SET stampsecs=stampsecs+3600
         IF clocksecs=stampsecs {
           WRITE !,"Daylight Saving Time variant:"
           WRITE !,"Local time offset 1 hour from timezone time" }
         ELSE { WRITE !,"Cannot reconcile due to local time variant" }
   }
   QUIT

関連項目

FeedbackOpens in a new tab