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?

$ZTIMEZONE

グリニッジ子午線からのタイム・ゾーン・オフセットを含みます。

Synopsis

$ZTIMEZONE
$ZTZ

概要

$ZTIMEZONE には以下の 2 つの使用方法があります。

$ZTIMEZONE には、グリニッジ子午線からのタイム・ゾーン・オフセットが分単位で含まれています (グリニッジ子午線には、英国とアイルランドのすべてが含まれています)。このオフセットは、-1440 から 1440 の間の符号付き整数として表されます。グリニッジの西側タイム・ゾーンは、正の数として指定され、グリニッジの東側タイムゾーンは負の数として指定されます (すべてのタイム・ゾーンの違いは整数時間ではないので、タイム・ゾーンは分で表されます)。既定では、$ZTIMEZONE はコンピュータのオペレーティング・システムに対するタイム・ゾーン設定に初期化されます。

Caution:

$ZTIMEZONE は、固定オフセットによりローカル時刻を調整します。これは、サマータイムなどのローカル時刻調整に合わせて調整されません。Caché では、基本となるオペレーティング・システムからローカル時刻を取得します。オペレーティング・システムは、そのコンピュータで各ロケールに構成されているローカル時刻調整を適用します。したがって、$ZTIMEZONE を使用して調整したローカル時刻には、$ZTIMEZONE で指定したタイム・ゾーンではなく、構成したロケールのローカル時刻調整が適用されます。

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

$ZTIMEZONE を使用する関数およびプログラムでは、経過ローカル時間は必ず連続していますが、時刻値は季節によりローカル時刻に合わせて調整する必要があります。季節的なローカル時刻調整の詳細は、$HOROLOG を参照してください。

タイム・ゾーンの設定

$ZTIMEZONE を使用して、現在の Caché プロセスで使用されているタイム・ゾーンを設定することができます。$ZTIMEZONE を設定しても、既定の Caché タイム・ゾーンや、使用しているコンピュータのタイム・ゾーン設定を変更することはありません。

Note:

$ZTIMEZONE 特殊変数の変更は、いくつかの特殊な状況のために作られた機能です。$ZTIMEZONE の変更は、Caché がローカルの日付/時刻の操作で使用する、タイム・ゾーンを変更するための一貫した方法ではありません。$ZTIMEZONE 特殊変数は、これを変更した結果として生じるすべての矛盾を処理できるプログラム以外では変更しないでください。

一部のプラットフォームでは、$ZTIMEZONE 特殊変数の変更よりも適切な方法でタイム・ゾーンを変更できる場合があります。そのプラットフォームにプロセス固有のタイム・ゾーン設定が存在する場合 (POSIX システム上の TZ 環境変数など)、外部システム呼び出しを通じてプロセス固有のタイム・ゾーンを変更する方法は、$ZTIMEZONE を変更する方法よりも適切である可能性があります。プロセス固有のタイム・ゾーンをオペレーティング・システム・レベルで変更すると、UTC からのローカル時刻オフセットが変更され、さらに、これに対応する、ローカル時刻調整の適用タイミングを決定するアルゴリズムも適用されます。このことが特に重要になるのは、既定のシステム・タイム・ゾーンが北半球のものである一方で、希望のプロセス・タイム・ゾーンが南半球のものである場合です。$ZTIMEZONE を変更すると、ローカル時刻が UTC からの新しいタイム・ゾーン・オフセットに変更されますが、ローカル時刻調整の適用タイミングを決定するアルゴリズムは変更されません。

SET コマンドを使用して、$ZTIMEZONE を指定された分の符号付き整数に設定します。最初の 0 と小数点は無視されます。$ZTIMEZONE を設定する際に、数値以外の値を指定するか、または値を指定しないと、Caché は $ZTIMEZONE を 0 (グリニッジ子午線) に設定します。

例えば、北米の東部標準時間 (EST) には、グリニッジに対して +5 時間の時差があります。したがって、現在の Caché プロセスを EST に設定するには、300 分と指定します。グリニッジの 1 時間前のタイム・ゾーンを指定するには、-60 分と指定します。グリニッジを指定するには、0 分と指定します。

$ZTIMEZONE の設定 :

  • 引数なしの $NOW() ローカル時刻値に影響を及ぼします。これは、$NOW() の時間部分を変更し、またこの変更が現在のプロセスの $NOW() の日付部分を変更します。$NOW() は、$ZTIMEZONE 設定をそのまま反映し、ローカル時刻調整に合わせてその値を調整することはありません。

  • $HOROLOG ローカル時刻値に影響を及ぼします。$HOROLOG$ZTIMEZONE からタイム・ゾーン値を取得したうえで、サマータイムなどの季節的なローカル時刻調整を適用してその時刻を調整します。したがって $HOROLOG は常にローカル時刻に従いますが、$HOROLOG の経過時間は 1 年を通じて連続的ではありません。

  • %SYSTEM.UtilOpens in a new tab クラス・メソッド IsDST()Opens in a new tabUTCtoLocalWithZTIMEZONE()Opens in a new tab、および LocalWithZTIMEZONEtoUTC()Opens in a new tab に影響を及ぼします。

  • $ZTIMESTAMP 値または $ZHOROLOG 値には影響しません

  • $ZDATE$ZDATEH$ZDATETIME$ZDATETIMEH$ZTIME$ZTIMEH の各関数によって実行される日付および時刻の形式変換には影響しません

  • $NOW(n) 関数には影響しません

  • $HOROLOG の日付に固定値を設定する %SYSTEM.ProcessOpens in a new tab クラスの FixedDate()Opens in a new tab クラス・メソッドには影響しません

$ZTIMEZONE を変更した後に、以下の変則性が発生します。

  • $ZDATETIME($HOROLOG,1,7) は、通常 UTC 時刻を返しますが、$ZTIMEZONE を変更すると UTC を返さなくなります。

  • $ZTIMEZONE を変更すると、$ZDATETIME($HOROLOG,1,5) は、正しいタイム・ゾーン・オフセットを返さなくなります。

  • $ZTIMEZONE を変更すると、ローカル時刻と UTC 時刻の間の $ZDATETIME($HOROLOG,-3) 変換および $ZDATETIMEH($ZTIMESTAMP,-3) 変換が不正確になります。

その他のタイム・ゾーン・メソッド

以下のように、TimeZone()Opens in a new tab クラス・メソッドを呼び出すことで、同じタイム・ゾーン情報を取得することができます。

   WRITE $SYSTEM.SYS.TimeZone()

詳細は、"InterSystemsクラスリファレンス" の %SYSTEM.SYSOpens in a new tab クラスを参照してください。

次の例のように、tformat 値 5 または 6 を指定して $ZDATETIME および $ZDATETIMEH 関数を使用することで、日付および時刻の文字列の一部としてローカル時刻の差異を返すことができます。

   WRITE !,$ZDATETIME($HOROLOG,1,5)

これは、次のような値を返します。

04/06/2011T12:31:16-04:00

この文字列の最後の部分 (-04:00) は、システムのローカル時刻調整設定を、グリニッジ子午線からのオフセット (時間と分で表現) として示したものです。このローカル時刻調整は、必ずしもタイム・ゾーン・オフセットではありません。上記の例では、タイム・ゾーンはグリニッジ標準時の 5 時間後 (-5:00) ですが、ローカル時刻調整 (サマータイム) によってこのタイム・ゾーンの時刻が 1 時間オフセットされて、-04:00 となります。$ZTIMEZONE を設定すると、$ZDATETIME($HOROLOG,1,5) によって返される現在のプロセスの日時が変更されますが、システムのローカル時刻調整設定は変更されません。

$ZDATETIMEH でのタイム・ゾーン設定の使用

dformat=-3 を指定して $ZDATETIMEH を使用することで、協定世界時 (UTC) の日付と時刻の値をローカル時刻値に変換できます。この関数は、UTC 値 ($ZTIMESTAMP) を入力として受け付けます。そして、ローカル・タイム・ゾーン設定を使用して、対応する日付と時刻を返します。サマータイムなどのローカル時刻調整の対象となっている場所であれば、その調整を適用した日付と時刻を返します。

   SET clock=$HOROLOG
   SET stamp=$ZDATETIMEH($ZTIMESTAMP,-3)
   WRITE !,"local/local date and time: ",$ZDATETIME(clock,1,1,2)
   WRITE !,"UTC/local date and time:   ",$ZDATETIME(stamp,1,1,2)

$ZTIMEZONE を使用したローカルと UTC の変換メソッド

%SYSTEM.UtilOpens in a new tab クラスの 2 つのクラス・メソッドは、ローカルの日付および時刻と UTC の日付および時刻の間の変換を行います。つまり、UTCtoLocalWithZTIMEZONE()Opens in a new tabLocalWithZTIMEZONEtoUTC()Opens in a new tab の変換です。これらのメソッドは、$ZTIMEZONE の変更に影響されます。

  WRITE $SYSTEM.Util.UTCtoLocalWithZTIMEZONE($ZTIMESTAMP),!
  WRITE $HOROLOG,!
  WRITE $SYSTEM.Util.LocalWithZTIMEZONEtoUTC($H),!
  WRITE $ZTIMESTAMP 

次の例は、現在のタイム・ゾーンを返します。

   SET zone=$ZTIMEZONE
   IF zone=0 {
     WRITE !,"Your time zone is Greenwich Mean Time" }
   ELSEIF zone>0 {
     WRITE !,"Your time zone is ",zone/60," hours west of Greenwich" }
   ELSE {
     WRITE !,"Your time zone is ",(-zone)/60," hours east of Greenwich" }

次の例は、タイム・ゾーンを設定することで日付および時刻を変更できることを示しています。

   SET zonesave=$ZTIMEZONE
   WRITE !,"Date in my current time zone:  ",$ZDATE($HOROLOG)
   IF $ZTIMEZONE=0 {
     SET $ZTIMEZONE=720 }
   ELSEIF $ZTIMEZONE>0 {
     SET $ZTIMEZONE=($ZTIMEZONE-720) }
   ELSE {
     SET $ZTIMEZONE=($ZTIMEZONE+720) }
   WRITE !,"Date halfway around the world: ",$ZDATE($HOROLOG)
   WRITE !,"Date at Greenwich Observatory: ",$ZDATE($ZTIMESTAMP)
   SET $ZTIMEZONE=zonesave

次の例は、ローカル時刻がタイム・ゾーンの時刻と同じかどうかを判断します。

   SET localnow=$HOROLOG, stamp=$ZTIMESTAMP
   WRITE !,"local date and time: ",$ZDATETIME(localnow,1,1)
   SET clocksecs=$PIECE(localnow,",",2)
   SET stampsecs=$EXTRACT(stamp,7,11)-($ZTIMEZONE*60)
   IF clocksecs=stampsecs {
      WRITE !,"No local time variant:" 
      WRITE !,"Local time is timezone time" }
   ELSE {
         IF clocksecs=stampsecs+3600 {
           WRITE !,"Daylight Saving Time variant:"
           WRITE !,"Local time offset 1 hour from timezone time" }
         ELSE { WRITE !,"Local time and time zone time are "
                WRITE !,(clocksecs-stampsecs)/60," minutes different" }
   }
   QUIT

関連項目

FeedbackOpens in a new tab