ソラマメブログ

  

Posted by at

2008年05月22日

LSLで日付の計算、日付の取得

こんにちは。
LSLのエディターで日本語がそのまま書き込めるということをつい先ほど知って、衝撃を受けている朔夜です。(情報に気づくの遅すぎですね;)
コードで変換する必要が無くなってたんですね~。日本語コメント打ち込むと、画面では□□□と出るので、日本語は使えないのだと思っていました。

・・・と、最初から馬鹿なことをやっておりますが^^;
色んな計算をしているうちに、ふと「LSLで日付や期限の計算ってどうするのかな?」と考えまして、実際に時間を計測しようと思ってみたんですけど・・・意外に関数が見つからなくて難航しました。(DateSirialとかBetweenとかDateDiffのような関数があると単純に考えていました;)

Second Life Wikiさんの「Date Library」にどうやら色々と書いてある様子というところまで突き止めて、けれど全て英語・・・!(英語は超苦手科目;)
片言翻訳しながら、以下、実験をした結果です~。

****↓のコードは、Date Library(http://wiki.secondlife.com/wiki/Date_Library)で公開されている内容です****

//日付yy/mm/ddから、日付の値(シリアル値と似たようなものだと思うので、以下シリアル値と表記)「g」を計算する。
integer gday(integer yy, integer mm, integer dd)
{
integer m = (mm + 9)%12; // mar=0, feb=11
integer y = yy - 1600 - m/10; // if Jan/Feb, year--
return y*365 + y/4 - y/100 + y/400 + (m*306 + 5)/10 + (dd - 1);
}

//本日の日付を取得する。
integer today()
{
string DateUTC = llGetDate();
integer year = (integer)llGetSubString(DateUTC, 0, 3);
integer month = (integer)llGetSubString(DateUTC, 5, 6);
integer day = (integer)llGetSubString(DateUTC, 8, 9);
return gday(year,month,day);//戻り値はgday関数を通して、シリアル値になる。
}

//シリアル値「d」の引数から、[ year, month, day]をリスト型で返す。
list sdate(integer d)
{
integer y = (10000*d + 14780)/3652425;
integer ddd = d - (y*365 + y/4 - y/100 + y/400);
if (ddd < 0) {
y--;
ddd = d - (y*365 + y/4 - y/100 + y/400);
}
integer mi = (52 + 100*ddd)/3060;
integer dd = ddd - (mi*306 + 5)/10 + 1;
return [
1600 + y + (mi + 2)/12,
(mi + 2)%12 + 1,
dd];
}

************************************************

日付、日数の計算を行うためには、まずは上記のようなユーザー関数をあらかじめ入れておく必要があるみたいです。

↓こんな例題も書かれていました。

************************************************
//二つの日付間の差をシリアル値で求める。
gday(y2,m2,d2) - gday(y1,m1,d1);

//n日後の日付を[ year, month, day]のリストで返す。
sdate(gday(y,m,d) + n)
************************************************

これでとりあえず日付は取得・計算できるみたいです~。
でも日本の場合は時差がありますから、そのあたりを計算に入れていかないといけませんよね。

そうすると、integer today() の中にある string DateUTC = llGetDate() の時点で、ちょっと手を加える必要が出てくるでしょうか・・・。
Second Life Wiki によりますと、
integer gIntDay = 86400; //-- 1 day in seconds
・・・ということで、1日の秒数は 86400 秒らしいです。

integer time = (integer)llGetGMTclock(); //現在の時間を取得(0時からの秒数)
integer JP_TIME = 9*3600; //時差(9時間分の秒数)
integer gIntDay = 86400; //1日の秒数

//時差を足して、秒数が1日を越えているかを判定
if(time+JP_TIME>gIntDay){
day = dai + 1;//日付が翌日になる
}

こんな計算をすると、日本時間の日付になるでしょうか。
まとめてみます~。

******************************************
//本日の日付を取得する。
integer today()
{
string DateUTC = llGetDate();
integer year = (integer)llGetSubString(DateUTC, 0, 3);
integer month = (integer)llGetSubString(DateUTC, 5, 6);
integer day = (integer)llGetSubString(DateUTC, 8, 9);

integer time = (integer)llGetGMTclock(); //現在の時間を取得(0時からの秒数)
integer jp_time = time + 9*3600; //時差(9時間分の秒数)
integer gIntDay = 86400; //1日の秒数

//時差を足して、秒数が1日を越えているかを判定
if(jp_time>gIntDay){
day = dai + 1;//日付が翌日になる
}

return gday(year,month,day);//戻り値はgday関数を通して、シリアル値になる。
}
******************************************
ううん、これで良いのでしょうか・・・。
もっと効率の良い方法がありましたら、誰か教えて下さい~っ;;

おまけ。
//今日の残り時間を計算(日本時間Ver)

string time(){
integer gIntDay = 86400; //1日の秒数
integer now = llGetGMTclock() + 9*3600;//現在時間
integer sec = gIntDay-now;//今日の残り時間(秒)

//secを時間文字列に変換
integer h = llFloor(sec/3600);//時間
sec = sec-h*3600;
integer m = llFloor(sec/60);//分
integer s = llFloor(sec%60);//秒

string time = "今日はあと" + (string)h + "時間" + (string)m + "分" + (string)s + "秒です。";
return(time);
}

↑の二つは、実働実験してないので、間違ってたらごめんなさい><  


Posted by 朔夜 at 13:06Comments(0)・・・雑記

2008年05月22日

手作り(?)マフィンでティータイム


1primマフィンつくってみました。プレーンとチョコチップの2種類です^^
週末発売予定の新作カップと一緒に出したいなぁと思っています。

現在、豊島区のメインショップでカップとマフィンの実物を展示中です~。
Coming soonということで、まだ飲むオブジェクトは組み込んでいないため閲覧専用ですが、色々な種類の飲物が切り替えて楽しめますので、よろしければ覗きにきてみて下さいませ^^  


Posted by 朔夜 at 02:01Comments(0)・・・制作雑記