LSL汎用関数 その4

れむ

2008年06月14日 11:35


さて、ネタが尽きてきました。今回はまだ使える関数です。
時刻関連の関数は標準であるといいのですが。

誰か良い時計でも作られたら私に下さい(笑)

//==============================================================================
//  Unixタイムをグレゴリオ暦に変換します。
//  time    Unixタイム
//  diff    時差
//  戻り値  [ 年, 月, 分, 時, 分, 秒 ] のリストを返します。
//==============================================================================
listunixtime2list(integer time, integer diff)
{
    time += 57974400 + diff * 3600;  // 24 * 60 * 60 * (365 + 306)
    integer n = time / 86400;        // 24 * 60 * 60
    integer day = n % 1461;          // 365 + 365 + 365 + 366
    integer year = n / 1461 * 4 + 1968;

    if (day >= 1095) {
        day -= 1095;
        year += 3;
    } else if (day >= 730) {
        day -= 730;
        year += 2;
    } else if (day >= 365) {
        day -= 365;
        ++year;
    }

    integer month = 3;
    n = 31;
    list lst = [ 0, 0, 0, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29 ];
    while (day >= n) {
        day -= n;
        n = llList2Integer(lst, month);
        month = -(~month);
    }

    if (month > 12) {
        ++year;
        month -= 12;
    }

    return [ year, month, day + 1, time / 3600 % 24, time / 60 % 60, time % 60 ];
}

【使用方法】
list lst = unixtime2list(1199145600, 0);      // lst = [ 2008, 1, 1, 0, 0, 0 ]
list lst = unixtime2list(llGetUnixTime(), 9); // lst = JST(日本時間)


//==============================================================================
//  日付をUnixタイムとして取得します。
//  year    年(1970~2038)
//  month   月(1~12)
//  day     日(1~31)
//  hour    時(0~)
//  minute  分(0~)
//  second  秒(0~)
//  戻り値  Unixを返します。範囲外の値は保障外です。
//==============================================================================
integer maketime(integer year, integer month, integer day,
        integer hour, integer minute, integer second)
{
    if (month < 3) {
        month += 12;
        --year;
    }
    year = (year * 365 + llList2Integer([ 0, 31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337 ], month - 3) + day)
        + llFloor(year / 4) - llFloor(year / 100) + llFloor(year / 400);
    return (year - 719469) * 86400 + (hour * 60 + minute) * 60 + second;
}

【使用方法】
integer time = maketime(2008, 1, 1, 0, 0, 0);    // time = 1199145600



//  曜日の戻り値はISO-8601形式準拠よりこの方が使いやすいよね……多分。

//==============================================================================
//  曜日を求めます。
//  有効な範囲はグレゴリオ暦1582年10月15日以降です。
//  year    年(西暦)
//  month   月
//  day     日
//  戻り値  曜日を(日曜日…0 ~ 土曜日…6)で返します。
//==============================================================================
integer dayofweek(integer year, integer month, integer day)
{
    if (month < 3) {
        --year;
        month += 12;
    }
    return (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + day) % 7;
}

【使用方法】
integer n = dayofweek(2008, 1, 1);        // n = 2
string str = llList2String([ "日", "月", "火", "水", "木", "金", "土" ],
                dayofweek(2008, 1, 1));  // str = "火"

MEMO
[ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]
[ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
[ "Dimanche", "Lundi", "Mardi","Mercredi", "Jeudi", "Vendredi", "Samedi" ]


//==============================================================================
//  現在の曜日を求めます。
//  diff    時差
//  戻り値  曜日を(日曜日…0 ~ 土曜日…6)で返します。
//==============================================================================
integer get_dayofweek(integer diff)
{
    return (llFloor((llGetUnixTime() + diff * 3600) / 86400) + 4) % 7;
}

【使用方法】
integer n = get_dayofweek(9);        // 日本時間の今日の曜日


おまけ

//==============================================================================
//  西暦を和暦に変換します。
//  year    西暦
//  戻り値  和暦を返します。範囲外は空リストを返します。
// [ 1 明治 / 2 大正 / 3 昭和 / 4 平成, 年数, 年号 ]
//==============================================================================
list to_wareki(integer year)
{
    if (1989 
        
Tips