Library: Date & Time functions - SLUniverse Forums
 
Navigation » SLUniverse Forums > Development Discussion and Support > Scripting » Library: Date & Time functions


Scripting Discuss scripting for SL and other platforms

Reply
 
LinkBack Thread Tools Display Modes
Old 10-31-2009, 11:15 AM   #1 (permalink)
Junior Member
 
Join Date: Oct 2009
Posts: 2
Library: Date & Time functions

Well, I had something more organized but I got the dreaded "Oops the link appears to be broken" when I posted this to the official forums and I hadn't saved what I wrote before submitting .. slow burn. Its not worth trying to figure out what the Lindens hate about the post so its going here instead - enjoy.

Here's a mess of date and time code from a project I've temporarily shelved. Its not as pretty and organized as I'd like it, but it was kind of frustrating hashing this out so I've lost any patience with it. Its part of a larger project which I've snipped out so there may be some code artifacts that don't line up.

Code:
string          date_order = "mdy";

integer _yr   = 0;
integer _mo   = 1;
integer _dy   = 2;
integer _hr   = 3;
integer _mi   = 4;
integer _ss   = 5;
integer _dow  = 6;
integer _unix = 7;

list days              = ["SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"];
list days_short        = ["SUN","MON","TUE","WED","THU","FRI","SAT"];
list months            = [
                             "JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE",
                             "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"
                        ];
list months_short     = ["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
string sDaysMonth     = "312831303130313130313031";
string sDaysYear      = "031059090120151181212243273304334365"; 
string sDOWMonth      = "033614625035";
string sDOWMonthLY    = "623614625035";

integer DAYS_PER_YEAR        = 365;           // Non leap year
integer SECONDS_PER_YEAR     = 31536000;      // Non leap year
integer SECONDS_PER_DAY      = 86400;
integer SECONDS_PER_HOUR     = 3600;
integer SECONDS_PER_MINUTE   = 60;

integer days_in_month(integer mo, integer yr)
{
    integer offset = (mo-1)*2;
    integer days = (integer)llGetSubString(sDaysMonth,offset,offset+1);    
    if ((is_leap_year(yr) == TRUE) && (mo == 2)) days++;
    return days;
}
integer DaysPerYear(integer year)
{
    if (is_leap_year(year))
        return DAYS_PER_YEAR + 1;
    else
        return DAYS_PER_YEAR;
}
integer date_to_days(list lDate)
{
    integer yr = llList2Integer(lDate,0);
    integer mo = llList2Integer(lDate,1);
    integer dy = llList2Integer(lDate,2);
    integer offset = (mo-2)*3;
    integer days;
    if (mo > 1) days = (integer)llGetSubString(sDaysYear,offset,offset+2);
    days += dy;
    if ((is_leap_year(yr) == TRUE) && (mo > 2)) days++;
    return days;
}
integer date_to_epoch_days(list lDate)
{
    integer yr = llList2Integer(lDate,0);
    integer mo = llList2Integer(lDate,1);
    integer dy = llList2Integer(lDate,2);
    integer leap_days = (yr-1968)/4;
    integer ordinary_days = (yr-1970) * 365;
    integer days_in_year = date_to_days([yr, mo, dy])-1;
    integer days_epoch = ordinary_days + leap_days + days_in_year;
    return days_epoch;
}
integer datetime_to_unixtime(list lDate, list lTime, integer tzAdj)
{
    integer yr = llList2Integer(lDate,0);
    integer mo = llList2Integer(lDate,1);
    integer dy = llList2Integer(lDate,2);
    integer hr = llList2Integer(lTime,0);
    integer mi = llList2Integer(lTime,1);
    integer ss = llList2Integer(lTime,2);
    integer days_epoch = date_to_epoch_days([yr, mo, dy]);
    integer unixtime = (days_epoch*86400)+(hr*3600)+(mi*60)+ss+(tzAdj*3600);
    return unixtime;
}
list days_to_date(integer days, integer year)
{
    integer i=1;
    integer n=days_in_month(i,year);
    integer d=days;
    while (d > n) {
        d -= n;
        i++;
        n=days_in_month(i,year);
    }
    return ([year,i,d]);
}
integer is_leap_year(integer year)
{     
    if( year % 4 )         return FALSE;
    if( year <= 1582 )     return TRUE;
    if( !( year % 400 ))   return TRUE;
    if( !( year % 100 ))   return FALSE;
    return TRUE;
}
integer last_day_in_month(integer mo, integer yr)
{
    integer dy;
    if (llListFindList([1]+[3]+[5]+[7]+[8]+[10]+[12], [mo]) > 0) dy = 31;
    if (llListFindList([4]+[6]+[9]+[11],              [mo]) > 0) dy = 30;
    if (mo == 2) {
        if (is_leap_year(yr) == TRUE) dy = 29;
        else                          dy = 28;
    }
    return dy;
}
integer date_to_dow(list lDate)
{
    integer yr = llList2Integer(lDate,0);
    integer mo = llList2Integer(lDate,1);
    integer dy = llList2Integer(lDate,2);
    integer dow;
    integer century_part = 6; // assume 21st century
    integer year_part = (yr-2000) + (integer)(yr-2000)/4;
    integer month_part;
    if (is_leap_year(yr)) month_part = (integer)llGetSubString(sDOWMonthLY,(mo-1),(mo-1));
    else                  month_part = (integer)llGetSubString(sDOWMonth,(mo-1),(mo-1));    
    dow = (century_part + year_part + month_part + dy)%7;
    return dow;
}
list date_calc(list lDate, list lTime, list lDateAdj, list lTimeAdj)
{
    integer yr     = llList2Integer(lDate, _yr);
    integer mo     = llList2Integer(lDate, _mo);
    integer dy     = llList2Integer(lDate, _dy);
    integer hr     = llList2Integer(lTime, 0);
    integer mi     = llList2Integer(lTime, 1);
    integer ss     = llList2Integer(lTime, 2);
    
    integer dy_adj = llList2Integer(lDateAdj, _dy);
    integer hr_adj = llList2Integer(lTimeAdj, 0);
    integer mi_adj = llList2Integer(lTimeAdj, 1);
    integer ss_adj = llList2Integer(lTimeAdj, 2);
    
    integer MiDy = hr*60 + mi + hr_adj*60 + mi_adj;
    integer SsDy = hr*3600 + mi*60 + ss;
    integer DyYr = date_to_days([yr, mo, dy]) + dy_adj;
    while (MiDy <     0)  { DyYr--; MiDy += 1440; }
    while (MiDy >= 1440)  { DyYr++; MiDy -= 1440; }
    while (SsDy <                0) {DyYr--; SsDy += SECONDS_PER_DAY;}
    while (SsDy >= SECONDS_PER_DAY) {DyYr++; MiDy -= SECONDS_PER_DAY;}
    while (DyYr <= 0) {
        yr--;
        DyYr += date_to_days([yr,12,31]);
    }
    while (DyYr > date_to_days([yr,12,31])) {
        DyYr -= date_to_days([yr,12,31]);
        yr++;
    }
    list l=days_to_date(DyYr, yr);
    mo = llList2Integer(l,1);
    dy = llList2Integer(l,2);
    hr = llFloor(MiDy/60);
    mi = MiDy%60;
    hr = llFloor(SsDy/3600);
    SsDy -= (hr*3600);
    mi = llFloor(SsDy/60);
    ss = SsDy - (mi*60);
    return ([yr, mo, dy, hr, mi, ss]);
}
list Unix2DateTime(integer unixtime)
{
    integer days_since_1_1_1970     = unixtime / SECONDS_PER_DAY;
    integer dy = days_since_1_1_1970 + 1;
    integer yr  = 1970;
    integer days_per_year = DaysPerYear(yr);
 
    while (dy > days_per_year) {
        dy -= days_per_year;
        ++yr;
        days_per_year = DaysPerYear(yr);
    }
 
    integer mo = 1;
    integer days_per_month = days_in_month(mo, yr);
 
    while (dy > days_per_month) {
        dy -= days_per_month;
 
        if (++mo > 12) {
            ++yr;
            mo = 1;
        }
 
        days_per_month = days_in_month(mo, yr);
    }
 
    integer seconds_since_midnight  = unixtime % SECONDS_PER_DAY;
    integer hr = seconds_since_midnight / SECONDS_PER_HOUR;
    integer ss = seconds_since_midnight % SECONDS_PER_HOUR;
    integer mi = ss / SECONDS_PER_MINUTE;
    ss = ss-(mi*SECONDS_PER_MINUTE);

    integer dow = date_to_dow([yr, mo, dy]);
   
    return [yr, mo, dy, hr, mi, ss, dow, unixtime];
}
integer is_integer(string s)
{
    integer i;
    for (i=0; i<llStringLength(s); i++) {
        if (llSubStringIndex("0123456789", llGetSubString(s,i,i)) == -1) return FALSE;
    }
    return TRUE;
}
string DateString(list lDate)
{
    integer year  = llList2Integer(lDate,0);
    integer month = llList2Integer(lDate,1);
    integer day   = llList2Integer(lDate,2);
   
    return (string)day + "-" + llList2String(months, month - 1) + "-" + (string)year;
}
string TimeString(list lTime)
{
    integer hour      = llList2Integer(lTime,0);
    integer minute    = llList2Integer(lTime,1);
    integer second    = llList2Integer(lTime,2);
    string  hourstr   = (string)hour;
    string  minutestr = (string)minute;
    string  secondstr = (string)second;
   
    if (hour   < 10) hourstr   = "0" + hourstr;
    if (minute < 10) minutestr = "0" + minutestr;
    if (second < 10) secondstr = "0" + secondstr;
    return hourstr + ":" + minutestr + ":" + secondstr;
}
Soen Eber is offline   Reply With Quote
2 Users Said Thanks :
Old 10-31-2009, 02:58 PM   #2 (permalink)
Junior Member
 
Join Date: Oct 2009
Posts: 2
Could someone move this to the scripting library, please? I didn't realize that forum existed and I was rather too frazzled from trying to post to the regular SL forum to do the proper due diligence before posting. Thanks.
Soen Eber is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On