Skip to content
lsl.devlsl.devLSL Dev

GetTimestampOffset

LSL Header: {{LSL Header}}
This function returns llGetTimestamp() with an hour offset. It will wrap day, month and year as required. If it is passed an offset of more than 24 hours either way, it will use the offset for US Pacific Time (SL time), automatically adjusting for DST.
string  sbGetTimestamp(integer  intOffset) {
    // Start with December for purposes of wrapping
    list    lstDays  = [31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    string  strTimestamp = llGetTimestamp();

    list    lstTime  = llParseString2List(strTimestamp, ["-", ":", ".", "T"], []);
    integer intYear  = llList2Integer(lstTime, 0);
    integer intMonth = llList2Integer(lstTime, 1);
    integer intDay   = llList2Integer(lstTime, 2);
    integer intHour  = llList2Integer(lstTime, 3);

    string  strYear;
    string  strMonth;
    string  strDay;
    string  strHour;

    if (intOffset == 0) { return strTimestamp; }

    if (intOffset < -24 || intOffset > 24) {
        intOffset = ((integer)llGetWallclock() - (integer)llGetGMTclock()) / 3600;
    }

    intHour+= intOffset;

    // Add a day to February in leap years
    if (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0)) {
        lstDays = llListReplaceList(lstDays, [29], 2, 2);
    }

    if (intOffset < 0) {
        if (intHour < 0) { 
            intHour+= 24;
            --intDay;
        }

        if (intDay < 1) {
            intDay = llList2Integer(lstDays, --intMonth);
        }

        if (intMonth < 1) {
            intMonth = 12;
            --intYear;
        }
    }

    if (intOffset > 0) {
        if (intHour > 23) {
            intHour-= 24;
            ++intDay;
        }

        if (intDay > llList2Integer(lstDays, intMonth)) {
            intDay = 1;
            ++intMonth;
        }

        if (intMonth > 12) {
            intMonth = 1;
            ++intYear;
        }
    }

    strYear  = (string)intYear;
    strMonth = (string)intMonth;
    strDay   = (string)intDay;
    strHour  = (string)intHour;

    if (llStringLength(strMonth) < 2) { strMonth = "0" + strMonth; }
    if (llStringLength(strDay)   < 2) { strDay   = "0" + strDay;   }
    if (llStringLength(strHour)  < 2) { strHour  = "0" + strHour;  }

    return
        strYear                   + "-" + 
        strMonth                  + "-" + 
        strDay                    + "T" + 
        strHour                   + ":" + 
        llList2String(lstTime, 4) + ":" + 
        llList2String(lstTime, 5) + "." + 
        llList2String(lstTime, 6) + "Z";
        // Obviously this isn't really Z time anymore, but I left it there in case there
        // are scripts expecting it.
}
Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.

From the Second Life Wiki

Community documentation adapted from GetTimestampOffset, by Linden Research, Inc. and contributing residents.View contributors and history.

Imported wiki revision:

Licensed under CC BY-SA 3.0. Last wiki edit: .Formatting and links have been adapted for this site; API metadata follows the LSL definitions.