PDTとPST
Gonbeが使っているLucky Board(LB)とかITEM CAMPとかマルチベンダーとか・・・その他色々なアイテム類も大部分が自作品です。^^
まあLSLの中級者レベルであれば、これらを自作する事は難しくないと思います。
実現すべき機能が分かっているのですからね。
ところで、これらに関しては、最近は事前に設置して、指定日時になると自動的にアクティブになり、指定期間を過ぎると自動的にクローズされるようにしています。
その方が設置でバタバタしないで済みますからね。。。^^;
この指定期間に関してですが、当初は日本標準時間(JST)を使う事が多かったです。
しかし最近はSL時間を使う事が多いです。
まあ、どちらでも良いようには作ってますが・・・
で、このSL時間ですが・・・
ご存知のとおりPDTとPSTが有ります。
PDTとは「太平洋夏時間(Pacific Daylight Time)」です。
PSTとは「太平洋標準時(Pacific Standard Time)」です。
PDTとPSTでは1時間違います。
PDTは「3月の第2日曜日午前2時から11月の第1日曜日午前2時までの期間」だそうです。
SLでもこの切り替えは行われています。
そこで問題が出ます。
例えば2010年12月18日~25日(SL時間)とした場合、日本時間ではPDTなら18日の午後4時~になりますし、PSTなら午後5時~になります。
スクリプトの内部的には、協定世界時(UTC - Universal Time, Coordinated)で現在の年月日時刻を取得しています。
PDTならUTC-7時間。
PSTならUTC-8時間。
になります。
ちなみに日本標準時はJST(Japan Standard Time)で、UTC+9時間になってます。
で、話を戻して、今はPDTなの?PSTなの?と言うのが分からないと、12月18日の午前零時が分からない事になってしまうのです。
LSL関連で、この辺を扱う関数は以下のようになります。
llGetDate():現在のUTC日付を返す。戻り値の形式はYYYY-MM-DDである。
llGetTimestamp():現在時刻(多分UTC)を返す。形式は"YYYY-MM-DDThh:mm:ss.ff..fZ"である。
llGetWallclock():サーバーのローカル時刻(0時からの経過秒数)を得る。この関数で得られる時間は、SLクライアントに表示されているPST/PDTに等しいようだ。
Gonbeは、この中ではllGetTimestamp()で、現在の年月日時刻(UTC)を取得して、日本時間なら+9時間。PDTなら-7時間と言う具合に計算して求めています。
今までは、PDTとPSTは内部では判断しないで、「あ~もうPDTに変わっているから、-7時間にして動かそう・・・」てな感じでやってました。
でも、今回llGetWallclock()を使って、今がPDTか?PSTか?の判断ができるように改良してみました。
その式を書くと、以下のようにしました。
integer diff_h=(integer)llGetWallclock()/3600 - (integer)llGetSubString((string)llGetTimestamp(),11,12);
これはサーバーのローカル時刻(秒)からローカル時を計算し、UTCでの現在時を取得して引いた差を求めています。
このdiff_hが-7か+17の場合はPDTの状態です。
それ以外はPSTです。(-8か+16になる)
+17になってしまうのは、日付が1日違うからです。
実際は17時-24時=-7時となって、-7時間で同じになります。
これでスクリプト内で、現在はPDTだからUTCから-7時間引いた時間で計算すれば良い・・・と判断できるようになりました。
う~ん。。。ややこしいな。。。-。-;
まあ、自分の覚書だから良いか。^^