Okada Hiroshi の blog

typo が多いです

日本時間表示

セカンドライフスクリプト言語 Linden スクリプトの小物を書きとめることにしました。 コードについては、保証なし、ご自由にお使い下さい。(Please treat this code as PDS.) なお、説明のため、コメントは日本語で表示します。

|| // 日本時間(yyyy-mm-dd hh:mm:ss)を表示する。 integer TZ=9; // 日本のタイムゾーン integer INTERVAL=10; // 更新間隔 string MSG_JAPAN_TIME; // 日本時間という文字列

// 100未満の整数値を "%02d" の形に整形します。 string zeroprefix( integer n) { if( n < 10){ return "0" + (string)n; } return (string)n; }

// 一年の初めの日を0とした数値を 01-01 〜 12-31 に変換する // leap が TURE の時、うるう年とする string day2mmdd( integer day, integer leap) { list mdays; if( leap){ mdays = [31,29,31,30,31,30,31,31,30,31,30,31]; }else{ mdays = [31,28,31,30,31,30,31,31,30,31,30,31]; } integer days = 0; integer m = 0; for( m=0; m<12; m++){ integer d = llList2Integer( mdays, m); if( days+d > day){ return zeroprefix( m+1) + "-" + zeroprefix( day - days + 1); } days += d; } return "00-00"; }

// 1970年1月1日を0とした日付数値を // yyyy-mm-dd の形に整形する。 // ただし、2001年から2099までしか正常に計算しない。 string day2yyyymmdd( integer day) { integer days =11323; // 2001-01-01 integer year; for( year = 2001; year<2100; year++){ if( year % 4 == 0){ // 2001年から2099年までしか考えないので if( days + 366 > day){ return (string)year + "-" + day2mmdd( day - days, TRUE); } days += 366; }else{ if( days + 365 > day){ return (string)year + "-" + day2mmdd( day -days, FALSE); } days += 365; } } return "0000-00-00"; // 計算不能 }

// unixtime (time_t) の数値を yyyy-mm-dd hh:mm:ss の文字列に変換する // 2001年から2099年までしか正しく計算しない。 string unixtime2yyyymmddhhmmss( integer unixtime) { integer sec = unixtime % 60; integer min = (unixtime / 60) % 60; integer hour = (unixtime / 3600) % 24; integer day = unixtime / (24*3600); return day2yyyymmdd( day) + " " + zeroprefix( hour) + ":" + zeroprefix( min) + ":" + zeroprefix( sec); }

// 日本時間(yyyy-mm-dd hh:mm:ss)を表示する。 default { state_entry() { // 日本時間という文字列 MSG_JAPAN_TIME = llBase64ToString("5pel5pys5pmC6ZaT") + "\n"; llSetTimerEvent( 1.0); // timer() イベントを起こす }

timer() {
    integer t = llGetUnixTime() ;
    // タイマーイベントが次の間隔で割り切れる時刻におこるようにする。
    llSetTimerEvent( INTERVAL - t % INTERVAL); 
    llSetText(  MSG_JAPAN_TIME 
                     + unixtime2yyyymmddhhmmss( t+TZ*3600), 
                     <1,1,1>, 1.0); // 文字形式に変換して表示
}

} ||<