User:Very Keynes

From Second Life Wiki
Jump to: navigation, search
//
// dbLib.Date.Time
//
//    Function:    integer dbDateTime(string date, float time)
//    Compresses a Date and Time into a single 32bit Integer value
//
//    Range of dates supported is 2000-03-01 to 2058-12-16
//    
//    Concieved as a DataType for VK-DBMS it allows for Compact staorage
//    of a DateTime String in a form that allows for Numerical compares
//    and easy sorting of data by Date and Time, as well as making other
//    Date Time Functions such as Day of Week and Differance between two
//    Dates perform as simple Numerical Computations.
//
//    Input Formats Supported:
//
//    LSL functions useualy supply the date in string format and the
//    time as  float. This function is compatable with the following:
//
//    A string formated as Date and Time such as the output of
//    llGetTimeStamp() - "YYYY-MM-DDThh:mm:ss.ff..fZ"
//        Only the date and hh:mm:ss are encoded, the fractions are discarded
//        if the time is provided as part of the date string the format is:
//
//            dbDateTime(llGetTimeStamp(), 0)
//            dbDateTime("2010-08-12T13:04:27", 0) 
//
//        Valid Seperators are ["-","/","T",":",".",","] so this format works:
//
//            dbDateTime("2010/08/12,13:04", 0)
//
//        AM/PM format is Also Suppoerted in addition to 24Hour Clock
//
//            dbDateTime("2010/08/12,1:04PM", 0)
//
//    The Date and Time may also be suppled seperately as a string, float pair
//    where the float represents seconds past midnight as provided by LSL.
//
//        dbDateTime(llGetDate(), llGetGMTClock())
//        dbDateTime(llGetDate(), llGetWallClock())
//        dbDateTime{"2010,8,12", 47040.0000)
//
integer dbDateTime(string date, float time)    
{
    list DateTime = llParseString2List(date, ["-","/","T",":",".",","],[]);
    if(llToUpper(llGetSubString(llList2String(DateTime, -1),-2,-1)) == "PM")
        DateTime = llListReplaceList(DateTime,[llList2Integer(DateTime,3) + 12], 3, 3);
    integer Y = llList2Integer(DateTime,0) - 2000 - ((llList2Integer(DateTime,1) + 9) % 12) / 10;
    return (Y * 365 + Y / 4 - Y / 100 + Y/400 + (((llList2Integer(DateTime,1) + 9) % 12) * 306 + 5) / 10 + (llList2Integer(DateTime,2) - 1))
        * 100000 + llList2Integer(DateTime,3) * 3600 + llList2Integer(DateTime,4) * 60 + llList2Integer(DateTime,5) + (integer)time;
}
//
//    Function:    string asDateTime(integer dt)
//    Expand 32bit Integer DateTime into a TimeStamp Format String
//
//    output format "YYYY-MM-DDThh:mm:ss"
//
string asDateTime(integer dt)
{
    integer t = dt % 100000;
    integer y = (10000 * (dt / 100000) + 14780)/3652425;
    if ((dt / 100000) - (y*365 + y/4 - y/100 + y/400) < 0){y--;}
    dt = (dt / 100000) - (y * 365 + y / 4 - y / 100 + y / 400);
    list DateTime = [(2000 + y + ((52 + 100 * dt) / 3060 + 2) / 12),
        (((52 + 100 * dt) / 3060 + 2) % 12 + 1),
        (dt - ((52 + 100 * dt) / 3060 * 306 + 5) / 10 + 1),
        ((t - (((t - (t % 60)) % 3600) / 60) - (t % 60)) / 3600),
        (((t - (t % 60)) % 3600) / 60), (t % 60)];
    dt = llGetListLength(DateTime);
    while(--dt > 0)if(llStringLength(llList2String(DateTime, dt)) < 2)
        DateTime = llListReplaceList(DateTime,["0" + llList2String(DateTime, dt)], dt, dt);
    return
        llList2String(DateTime,0) + "-" +
        llList2String(DateTime,1) + "-" +
        llList2String(DateTime,2) + "T" +
        llList2String(DateTime,3) + ":" +
        llList2String(DateTime,4) + ":" +
        llList2String(DateTime,5);
}
//
//    Function:    integer GetDofW(string date)
//    Find the Day of the week for the Date provided
//
//    intput may be a date srting or any of the LSL date functions
//
//        GetDow("2010/8/12")
//        GetDow(llGetTimStamp())
//        GetDoW(llGetDate())
//
//    output format 0 -> 6 where Sunday = day 0
//
integer GetDoW(string date){return ((3 + (dbDateTime(date,0)/100000))%7);}
//
//    Function:    integer GetDif(string date1, string date2)
//    Find the Differance between the two dates Date1 - Date2
//
//    intput may be a date srting "2010/8/12" or any of the LSL date functions
//
//        GetDow(llGetDate(), "2009,12,31")     = Day Number in Year 2010
//        GetDow("2010-12-31", llGetTimStamp()) = Number of days remaining in Year 
//
//    output format integer in the range 0 --> 21474
//    being the date diferance (2058-12-16) - (2000-03-01)
//
integer GetDif(string date1, string date2){return((dbDateTime(date1,0) - dbDateTime(date2,0))/100000);}
//
//    Function:    string GetSLTimeStamp()
//        Return a TimeStamp corrected to PST Time including Daylight Saving
//
string  GetSLTimeStamp(){
    if (llGetGMTclock() -  llGetWallclock() < 0)return asDateTime(dbDateTime(llGetDate(),llGetWallclock()) - 100000);
    else return asDateTime(dbDateTime(llGetDate(),llGetWallclock()));}
//        
default
{
    state_entry()
    {
        // formating and range tests
        llSay(0, "Today & 2:15PM            "+asDateTime(dbDateTime(llGetDate()+"T2:15PM",0)));
        llSay(0, "Today & 2:15am            "+asDateTime(dbDateTime(llGetDate()+"T2:15am",0)));
        llSay(0, "minimum date              "+asDateTime(0));
        llSay(0, "maximum date              "+asDateTime(0x7FFFFFFF));
        llSay(0, "maximum date Differance   "+GetDif(asDateTime(0x7FFFFFFF), asDateTime(0)));
        llSay(0, "Overflow                  "+asDateTime(0x80000000));
        llSay(0, "\n\ntouch for inforamtion on the current day\n");
    }
    touch_start(integer total_number)
    {
        // examples of use
        //
        string SLdate = llGetSubString(GetSLTimeStamp(), 0, 9);
        llSay(0, "The Date Today in Second Life is " + SLdate);
        llSay(0, "The Day of the Week Today is "+llList2String(["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],GetDoW(SLdate)));
        llSay(0, "it is day number "+(string)GetDif(SLdate,"2009,12,31")+" of the Year");
        llSay(0, "in Week "+(string)(GetDif(SLdate,"2009,12,31")/7) + " of 52");       
        llSay(0, "with "+(string)GetDif("2010-12-31", SLdate)+" Days left this year\n");
        integer UTC = dbDateTime(llGetTimestamp(),0);
        llSay(0, (string)UTC + " is the integer Date & Time now in UTC" );
        integer PST = dbDateTime(GetSLTimeStamp(),0);
        llSay(0, (string)PST + " is the integer Date & Time now in PST" );
        llSay(0, llGetSubString(asDateTime(UTC - PST), 11, -1) + " is the time differance\n");
        llSay(0, asDateTime(dbDateTime(llGetDate(),llGetGMTclock()))+" is the date and time derived from llGetDate & llGetGMTclock ");
        llSay(0, asDateTime(dbDateTime(llGetDate(),llGetWallclock()))+" is the date and time derived from llGetDate & llGetWallclock ");
        llSay(0, "llGetTimeStamp() = " + llGetTimestamp());
        llSay(0, "GetSLTimeStamp() = " + GetSLTimeStamp() + " with GetSLTimeStamp() both Date and Time are corrected for daylight Saving");
    }
}