2010年2月24日水曜日

(LSL)日本時間を計算するときの罠・・・実録編

おはよーございます^^

「罠」なんて書きましたが、よーするに、私が不注意でバグ作り込んでただけの話ですが・・・^^;

LSLで日本時間を取得するとき、どうやってます?GMTやPSTを取得する関数から、時差分を足して使ってますか?
有名な式ですけど、たとえばこんな感じ。

jst = (integer)llGetGMTclock() + (9 * 3600);

llGetGMTclock関数でグリニッジ標準時(0時からの経過秒数)をゲットして、それに日本標準時(jst)の時差9時間分の秒数(9時間×3600秒)を足し込むという処理です。
これ、一見うまく動作してるように見えてたんですよね。。。時・分・秒を計算するとき、今までこうやって時間とか取得してて、特に問題が発生していなかったんで。

でも、使い方次第ではこの処理では問題があることがわかります。実は、昨日のシャッターとメッセージクロックのトラブル、これが原因だったんです^^;
なんか、GMTに時差を足すんだから、それで完璧じゃ~ん、とか考えますよね???
え???そんな風には考えない???あ、、、、そういうスルドイ人は、これから先読まなくてもいいですw
私、てっきりそう思っちゃってたんです。もう、この式で完璧だ~ってw

ちょっと実験してみましょう。
実験のための式は、以下の通り。

gmt = (integer)llGetGMTclock();
jst = (integer)llGetGMTclock() + (9 * 3600);

gmtとjstが取り得る値(0時からの経過秒数・・・と勝手に私が思い込んでいた数字w)の範囲

0 < gmt < 86399
32400 < jst < 118799

わかりますか?jstの値は、たとえ日本時間の深夜0時であっても、経過秒数は0にならないんです^^;
なぜかって?そりゃ、もう、jstの計算式は単純にgmtの値に足し算してるだけですからねーw
時差分の秒数が単純にプラス方向に振れちゃってたわけです@@;

私、これでバグりました;_;

で、解決策ですが。

jstの数字を、一日の総秒数(60秒 x 60分 x 24時間 = 86400秒)で割り算しましょう。そうすれば、その余りの数字が0時からの経過秒数になります。式にしたら、こんなかんじ。

jst = ((integer)llGetGMTclock() + (9 * 3600)) % 86400;

これでちゃんと動作するハズですw
時間計算でハマったら、ぜひこの事思い出してあげてください^^;;

<付録>
こんな関数作って持ってると、何かと便利かもしれませんね^^

integer GetJst(){
return ((integer)llGetGMTclock() + 9 * 3600) % 86400;
}

0 件のコメント:

コメントを投稿