Don't click here unless you want to be banned.

LSL Wiki : LibraryTimeElapsed

HomePage :: PageIndex :: RecentChanges :: RecentlyCommented :: UserSettings :: You are crawl411.us.archive.org
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
Comments [Hide comments/form]
Attach a comment to this page: