バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.


RWZoneSimple

RWZoneSimple RWZone

形式

#include <time.h>
#include <rw/zone.h>

RWZoneSimple myZone(USCentral);

説明

このクラスは、クラス RWZone が定義した抽象インタフェースを実装します。夏時間に関して、米国や多くのヨーロッパおよびアジア諸国の規則を十分に表現できる、簡単な規則を表します。この規則は表駆動型で、クラス RWDaylightRule によって指定されるパラメータによって決まります。

RWDaylightRule を直接使用すれば、RWZoneSimple に対する最も一般的なインタフェースを利用できます。しかし下の例で示すように、プログラムで表現できる、もっと単純なインタフェースもあります。

RWZoneSimple の 3 つのインスタンスがプログラムの実行開始時に自動的に作成され、それぞれ世界時間、標準時間、現地時間を表します。これらのインスタンスは、それぞれ RWZone::utc()RWZone::standard()RWZone::local() の各静的メンバー関数への呼び出しによって使用可能になります。これらのメンバー関数は、環境変数 TZ が定義する実行環境のタイムゾーン機能に従って設定されます。デフォルトでは、夏時間が実施されていれば、現地タイムゾーンのインスタンスは米国 (RWZone::NoAm) の夏時間規則を使用します。

北米以外の開発者のための注意: タイムゾーンは C 標準大域変数 _daylight に依存するため、タイムゾーンによってはこのデフォルトは正しくありません。この変数は、別のタイムゾーン規則が利用できるかどうか、また、夏時間の有無にかかわらず、設定されます。また、夏時間によって影響される履歴期間は北米の場合と異なります。したがって、北米の規則がまちがって使用されます。これらのデフォルトのタイムゾーンを正しくする最善の方法は、適切な RWDaylightRule を使用して RWZoneSimple を作成し、この値で RWZone::local()RWZone::std() を初期化することです。

RWZoneSimple の他のインスタンスは、それぞれ他のタイムゾーンを表すように作成でき、また RWZone の静的メンバー関数 RWZone::local(const RWZone*)RWZone::standard(const RWZone*) を使用して、大域的に設定できます。

持続性

なし

大域的な "現地" 時間として米国セントラル時間を設定する場合は、次のように呼び出します。

RWZone::local(new RWZoneSimple(RWZone::USCentral));
夏時間がないハワイ時間を設定する場合は、次のように呼び出します。

RWZone::local(new RWZoneSimple(RWZone::Hawaii, RWZone::NoDST));
同様、日本についても次のように呼び出します。

RWZone::local(new RWZoneSimple(RWZone::Japan, RWZone::NoDST));
フランスについては、次のように呼び出します。

RWZone::local(new RWZoneSimple(RWZone::Europe, RWZone::WeEu));
以下は、RWZone::DstRuleRWZone::NoAm 値と RWZone::WeEu 値で内部的に使用されている規則です。

// 4 月の最後の日曜日から 10 月の最後の日曜日まで
     const RWDaylightRule  usRuleAuld =
     { 0, 0000, 1, { 3, 4, 0, 120 }, { 9, 4, 0, 120 } };
// 4 月の最初の日曜日から 10 月の最後の日曜日まで
     const RWDaylightRule usRule67 =
     { &usRuleAuld, 1967, 1, { 3, 0, 0, 120 }, { 9, 4, 0, 120 } };
// 1 月の最初の日曜日から 10 月の最後の日曜日まで
     const RWDaylightRule usRule74 =
     { &usRule67, 1974, 1, { 0, 0, 0, 120 }, { 9, 4, 0, 120 } };
// 2 月の最後の日曜日から 10 月の最後の日曜日まで
     const RWDaylightRule usRule75 =
    { &usRule74, 1975, 1, { 1, 4, 0, 120 }, { 9, 4, 0, 120 } };
// 4 月の最後の日曜日から 10 月の最後の日曜日まで
     const RWDaylightRule usRule76 =
     { &usRule75, 1976, 1, { 3, 4, 0, 120 }, { 9, 4, 0, 120 } };
// 4 月の最初の日曜日から 10 月の最後の日曜日まで
     const RWDaylightRule usRuleLate =
     { &usRule76, 1987, 1, { 3, 0, 0, 120 }, { 9, 4, 0, 120 } };

// 3 月の最後の日曜日から 9 月の最後の日曜日まで
     const RWDaylightRule euRuleLate =
     { 0, 0000, 1, { 2, 4, 0, 120 }, { 8, 4, 0, 120 } };
前述の定義に従うと、次の呼び出しは最初の米国セントラル時間の例と同じことになります。

RWZone::local(new RWZoneSimple(RWZone::USCentral, &usRuleLate));
RWZone::local(new RWZoneSimple(RWZone::USCentral));
RWDaylightRuleRWZoneSimple で表現できない夏時間制は、クラス RWZone から派生させ RWZone の仮想関数を実装することで表現しなければなりません。

たとえば英国の夏時間規則では、議会がその年について他の時間に決めない限り、夏時間は 4 月の第 3 土曜日後の朝に始まります。年によっては 2 時間早くなったり、冬まで延期されたこともあります。英国の夏時間に対応するために、RWZone クラスを作成する価値が確かにあります。

コンストラクタ

RWZoneSimple(RWZone::StdZone zone,
             RWZone::DstRule = RWZone::NoAm);

内部の RWDaylightRules を使用して RWZoneSimple インスタンスを作成します。これは RWZoneSimple の最も単純なインタフェースです。第 1 引数には RWZoneSimple を構築するタイムゾーン、第 2 引数には適用する夏時間規則を指定します。

RWZoneSimple(const RWDaylightRule* rule,
             long tzoff,  const RWCString& tzname,
             long altoff, const RWCString& altname);

指定された規則に従って夏時間が計算される RWZoneSimple インスタンスを作成します。変数 tzofftzname は、それぞれ、標準時の UTC からのオフセット (秒数、経度 0 の西なら正) と名前を表します。引数 altoffaltname は、それぞれ、夏時間が実施されるときのオフセット (通常、tzoff - 3600 に等しい) と名前を表します。rule が NULL なら、夏時間は実施されません。

RWZoneSimple(long tzoff, const RWCString& tzname);

夏時間がない RWZoneSimple インスタンスを作成します。引数 tzoff は UTC からのオフセット (秒数、経度 0 の西なら正)、引数 tzname はタイムゾーンの名前を表します。

RWZoneSimple(RWZone::StdZone zone,
             const RWDaylightRule* rule);

オフセットと名前が StdZone 引数で指定されている RWZoneSimple インスタンスを作成します。rule 引数が NULL でなければ、それに従って夏時間が計算されます。NULL ならば、夏時間は実施されません。

構造体 RWDaylightRule

RWZoneSimple のコンストラクタに渡された RWDaylightRule 構造体は、すべての年に有効な 1 つの規則か、または、以前にさかのぼれる規則のチェインの先頭部分の可能性もあります。

RWDaylightRule はコンストラクタを必要としない構造体です。これは上記の節で使用した構文で初期化できます。この構造体のデータメンバーは次のとおりです。

struct RWExport RWDaylightRule {
  RWDaylightRule const* next_;
  short firstYear_;
  char observed_;
  RWDaylightBoundary begin_;
  RWDaylightBoundary end_;
}

RWDaylightRule const*
next_;

時間をさかのぼるチェインの中の次の規則を指します。

short
firstYear_;

この規則が最初に有効になる年の 4 桁の指定。

char
observed_;

夏時間を採用しない期間を指定するためのブール値。

1 = この期間夏時間を採用する。

0 = この期間夏時間を採用しない。

(01 の数値で区別されます。)

RWDaylightBoundary
begin_;

この構造体は、DST がこの期間何時始まるかの日時などを示します。(次の RWDaylightBoundary を参照してください。

RWDaylightBoundary
end_;

この構造体は、標準時間がこの期間何時再開するかの日時などを示します。(次の RWDaylightBoundary を参照してください。)

構造体 RWDaylight-Boundary

struct RWExport RWDaylightBoundary {
  // この構造体は、<time.h> 構造体 tm 表記を使用します。
  int month_;    // [0..11]
  int week_;     // [0..4], or -1
  int weekday_;  // [0..6], 0=Sunday; or, [1..31] if week_== -1
  int minute_;   // [0..1439]  (Usually 2 AM, = 120)
};

int
month_;

0 - 11 の月数。01 月。

int
week_;

0 - 4 で表す月の週数。次のフィールドがその月内の 1 日を表す場合は、-1

int
weekday_;

0 - 6 で表す曜日。0 は日曜日。または、week_ フィールドが -1 の場合、1 - 31 で表す月の日数。

int
minute_;
0 - 1439 で表す 12:00 AM からの経過分数。たとえば、120 は 2 AM。



1 仮想関数ではない関数を仮想関数として動作させる方法の詳細は、ユーザーズガイドの「RWString」という項目を参照してください。