れむ
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