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;
}
ScriptLibrary