バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
RWZoneSimple
RWZoneSimple RWZone
#include <time.h> #include <rw/zone.h> RWZoneSimple myZone(USCentral);
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));
// 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));
たとえば英国の夏時間規則では、議会がその年について他の時間に決めない限り、夏時間は 4 月の第 3 土曜日後の朝に始まります。年によっては 2 時間早くなったり、冬まで延期されたこともあります。英国の夏時間に対応するために、RWZone クラスを作成する価値が確かにあります。
RWZoneSimple(RWZone::StdZone zone, RWZone::DstRule = RWZone::NoAm);
RWZoneSimple(const RWDaylightRule* rule, long tzoff, const RWCString& tzname, long altoff, const RWCString& altname);
RWZoneSimple(long tzoff, const RWCString& tzname);
RWZoneSimple(RWZone::StdZone zone, const RWDaylightRule* rule);
RWDaylightRule はコンストラクタを必要としない構造体です。これは上記の節で使用した構文で初期化できます。この構造体のデータメンバーは次のとおりです。
struct RWExport RWDaylightRule { RWDaylightRule const* next_; short firstYear_; char observed_; RWDaylightBoundary begin_; RWDaylightBoundary end_; }
RWDaylightRule const* next_;
short firstYear_;
char observed_;
RWDaylightBoundary begin_;
RWDaylightBoundary end_;
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_;
int week_;
int weekday_;
int minute_;