GetTimestampOffset
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
This function returns llGetTimestamp() with an hour offset. It will wrap day, month and year as required. Offsets of more than 24 hours either way are not supported.
<lsl> 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) + intOffset;
string strYear; string strMonth; string strDay; string strHour;
if (intOffset == 0) { return strTimestamp; }
// 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";
} </lsl>