Okada Hiroshi の blog

typo が多いです

日本時間表示(2)

http://d.hatena.ne.jp/OkadaHiroshi/20071104/p1 きのう書いたスクリプトは、年号を計算するのにループを使っていて、 頭が悪すぎるので、修正版

|| // 日本時間(yyyy-mm-dd hh:mm:ss)を表示する。 integer TZ=9; // 日本のタイムゾーン integer INTERVAL=10; // 更新間隔 string MSG_JAPAN_TIME; // 日本時間という文字列 integer DAY1YEAR=365; // 1年の日数 integer DAY4YEAR=1461; // 4年の日数 integer DAY100YEAR=36524; // 100年の日数 integer DAY400YEAR=146097; // 400年の日数 integer DAY1970=719162;

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

// 閏年かどうか integer is_leap_year( integer year) { if( year % 400 == 0){ return TRUE; }else if( year % 100 == 0){ return FALSE; }else if( year % 4 == 0){ return TRUE; } return FALSE; }

// 一年の初めの日を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 の形に整形する。 string day2yyyymmdd( integer day) { day += DAY1970; // 1年1月1日基準にする integer year = 1;

year += 400*(day / DAY400YEAR);
day = day % DAY400YEAR;

year += 100*(day/DAY100YEAR);
day = day % DAY100YEAR;

year += 4*(day/DAY4YEAR);
day = day % DAY4YEAR;

year += day/DAY1YEAR;
day = day % DAY1YEAR;   

return (string)year + "-" + day2mmdd( day, is_leap_year(year));

}

// unixtime (time_t) の数値を yyyy-mm-dd hh:mm:ss の文字列に変換する 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); // 文字形式に変換して表示
}

} ||< なお、コードについては、保証なし、ご自由にお使い下さい。(Please treat this code as PDS.)