TimeElapsed
De DigiWiki.
This function can report the amount of real time passed between subsequent calls with millisecond precision. If it breaks, you can keep both pieces. - ChromalBrodsky.
// string elapsed(string sTime) // ---------------------------- // Chromal Brodsky - 2005-01-05 // // elapsed() uses the highest precision clock available in LSL, llGetTimestamp(), // to implement a timer with greater than one-second precision. // // Typical use: // // string sStart = elapsed(""); // some_function(); // string sElapsed = elapsed(sStart); // // At the end of the above example, sElapsed is in the format of hh:mm:ss.ssssss, // e.g.: "00:01:10.605000" // // On Lusk running at 1000 FPS on sim367.agni.lindenlab.com, // I sampled the following times for { sTime = elapsed(""); llWhisper(0, elapsed(sTime) );} // // 00:00:00.010000 00:00:00.003000 00:00:00.003000 00:00:00.003998 // 00:00:00.002998 00:00:00.003002 00:00:00.012000 00:00:00.004001 // 00:00:00.004000 00:00:00.005001 00:00:00.003000 00:00:00.004999 // YMMV string elapsed(string sTime) { if (sTime == "" ) { sTime = llGetTimestamp(); } else { string sH; string sM; string sS; string sTimeEnd = llGetTimestamp(); integer iHour = (integer)llGetSubString( sTimeEnd, 11, 12 ); integer iMin = (integer)llGetSubString( sTimeEnd, 14, 15 ); float fSec = (float)llGetSubString( sTimeEnd, 17, 22 ); integer iHour_start = (integer)llGetSubString( sTime, 11, 12 ); integer iMin_start = (integer)llGetSubString( sTime, 14, 15 ); float fSec_start = (float)llGetSubString( sTime, 17, 22 ); if (iHour < iHour_start) { iHour += 24; } if (iMin < iMin_start) { iMin += 60; } if (fSec < fSec_start) { fSec += 60.0; } iHour = iHour - iHour_start; iMin = iMin - iMin_start; fSec = fSec - fSec_start; if (iHour < 10) { sH = "0"; } if (iMin < 10) { sM = "0"; } if (fSec < 10.0) { sS = "0"; } sTime = sH + (string)iHour + ":" + sM + (string)iMin + ":" + sS + (string)fSec; } return sTime; }
Based off of elapsed and this script. It calculates the difference between two timestamps.
// string timestamp_difference(string sTimeStart, string sTimeEnd) // // At the end of the above example, timestamp_difference is in the format of ddddd:hh:mm:ss.ssssss, // e.g.: "00000:00:01:10.605000" string timestamp_difference(string sTimeStart, string sTimeEnd) { list daysPerMonth = [ 0, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333 ]; if (sTimeStart == "" ) return sTimeEnd; if (sTimeEnd == "") sTimeEnd = llGetTimestamp(); integer year = (integer) llGetSubString(sTimeEnd, 0, 3); integer month = (integer) llGetSubString(sTimeEnd, 5, 6); integer iDay = (year * 365) + ((year - 2878169) / 4) + llList2Integer( daysPerMonth, month ) + (integer) llGetSubString(sTimeEnd, 8, 9) + (month>2) * !(year % 4); integer iHour = (integer)llGetSubString( sTimeEnd, 11, 12 ); integer iMin = (integer)llGetSubString( sTimeEnd, 14, 15 ); float fSec = (float)llGetSubString( sTimeEnd, 17, 22 ); year = (integer) llGetSubString(sTimeStart, 0, 3); month = (integer) llGetSubString(sTimeStart, 5, 6); integer iDay_start = (year * 365) + ((year - 2878169) / 4) + llList2Integer( daysPerMonth, month ) + (integer) llGetSubString(sTimeStart, 8, 9) + (month>2) * !(year % 4); integer iHour_start = (integer)llGetSubString( sTimeStart, 11, 12 ); integer iMin_start = (integer)llGetSubString( sTimeStart, 14, 15 ); float fSec_start = (float)llGetSubString( sTimeStart, 17, 22 ); while (fSec < fSec_start) { fSec += 60.0; --iMin; } while (iMin < iMin_start) { iMin += 60; --iHour; } while (iHour < iHour_start) { iHour += 24; --iDay; } iHour = iHour - iHour_start; iMin = iMin - iMin_start; fSec = fSec - fSec_start; string sH = ":"; string sM = sH; string sS = sH; string sD; if (iHour < 10) sH = ":0"; if (iMin < 10) sM = ":0"; if (fSec < 10.0) sS = ":0"; sD=(string)iHour; return llGetSubString("00000",llStringLength(sD),5) + sD + sH + (string)iHour + sM + (string)iMin + sS + (string)fSec; }