Difference between revisions of "Unix2DateTime"

From Second Life Wiki
Jump to navigation Jump to search
m (Added to Category: Script Library)
m (<lsl> tag to <source>)
 
(7 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header|ml=*}} __NOTOC__
== Unix2DateTime v1.0 ==
{{#vardefine:p_unixtime_desc|number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC, ie. return value of llGetUnixTime()
<pre>
}}{{#vardefine:p_time_desc|list of integers [year, month, day, hour, minute, second]
/////////////////////////////////////////////////////////////////////
}}
<div id="box">
== Function: [[list]] Unix2DateTime([[integer]] {{LSL Param|unixtime}}); ==
<div style="padding: 0.5em;">
Returns a [[list]] of [[integer|integers]] comprising the date [year, month, day, hour, minute, second].
{|
{{LSL DefineRow|[[integer]]|unixtime|{{#var:p_unixtime_desc}}}}
|}
</div></div>
 
<div id="box">
{{#vardefine:p_year_desc|range from 1970 to 2038}}{{#vardefine:p_month_desc|range from 1 to 12}}{{#vardefine:p_day_desc|range from 1 to 31}}{{#vardefine:p_hour_desc|range from 0 to 23}}{{#vardefine:p_minute_desc|range from 0 to 59}}{{#vardefine:p_second_desc|range from 0 to 59}}
== Function: [[integer]] DateTime2Unix([[integer]] {{LSL Param|year}},[[integer]] {{LSL Param|month}},[[integer]] {{LSL Param|day}},[[integer]] {{LSL Param|hour}},[[integer]] {{LSL Param|minute}},[[integer]] {{LSL Param|second}}); ==
<div style="padding: 0.5em;">
Returns an [[integer]] comprising the date in number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC.
{|
{{LSL DefineRow|[[integer]]|year|{{#var:p_year_desc}}}}
{{LSL DefineRow|[[integer]]|month|{{#var:p_month_desc}}}}
{{LSL DefineRow|[[integer]]|day|{{#var:p_day_desc}}}}
{{LSL DefineRow|[[integer]]|hour|{{#var:p_hour_desc}}}}
{{LSL DefineRow|[[integer]]|minute|{{#var:p_minute_desc}}}}
{{LSL DefineRow|[[integer]]|second|{{#var:p_second_desc}}}}
|}
</div></div>
 
<div id="box">
 
== Function: [[string]] DateString([[list]] {{LSL Param|time}}); ==
<div style="padding: 0.5em;">
Returns a [[string]] comprising the date as DD-MON-YYYY.
{|
{{LSL DefineRow|[[list]]|time|{{#var:p_time_desc}}}}
|}
</div></div>
 
<div id="box">
== Function: [[string]] TimeString([[list]] {{LSL Param|time}}); ==
<div style="padding: 0.5em;">
Returns a [[string]] comprising the time as HH24:MI:SS.
{|
{{LSL DefineRow|[[list]]|time|{{#var:p_time_desc}}}}
|}
</div></div>
 
<div id="box">
== Specification ==
<div style="padding: 0.5em;">
<source lang="lsl2">/////////////////////////////////////////////////////////////////////
// Script Library Contribution by Flennan Roffo
// Script Library Contribution by Flennan Roffo
// Logic Scripted Products & Script Services
// Logic Scripted Products & Script Services
Line 18: Line 65:
// USAGE:
// USAGE:
// list timelist=Unix2DateTime(llGetUnixTime());
// list timelist=Unix2DateTime(llGetUnixTime());
// llSay(0, "Date: " +  DateString(timelist); // displays date as DD-MON-YYYY
// llSay(PUBLIC_CHANNEL, "Date: " +  DateString(timelist); // displays date as DD-MON-YYYY
// llSay(0, "Time: " +  TimeString(timelist); // displays time as HH24:MI:SS
// llSay(PUBLIC_CHANNEL, "Time: " +  TimeString(timelist); // displays time as HH24:MI:SS
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////


Line 33: Line 80:
                         "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" ];
                         "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" ];


////////////////////////////// LeapYear() /////////////////////////////
// This leap year test works for all years from 1901 to 2099 (yes, including 2000)
 
// Which is more than enough for UnixTime computations, which only operate over the range [1970, 2038].  (Omei Qunhua)
integer LeapYear(integer year)
integer LeapYear( integer year)
{
{
     if (year % 4 == 0)
     return !(year & 3);
    {
        if (year % 100 == 0)
        {
            if (year % 400 == 0)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            return 1;
        }
    }
    else
    {
        return 0;
    }
}
}
 
////////////////////////////// DaysPerMonth() ///////////////////////////////////////
integer DaysPerMonth(integer year, integer month)
               
integer DaysPerMonth(integer year,integer month)
{
{
     if (month < 8)
     // Compact Days-Per-Month algorithm. Omei Qunhua.
     {
     if (month == 2) return 28 + LeapYear(year);
        if (month % 2 == 0)
    return 30 + ( (month + (month > 7) ) & 1);          // Odd months up to July, and even months after July, have 31 days
        {
            if (month == 2)
            {
                if (LeapYear(year))
                {
                    return 29;
                }
                else
                {
                    return 28;
                }
            }
            else
            {
                return 30;
            }
        }
        else
        {
            return 31;
        }
    }
    else
    {
        if (month % 2 == 0)
        {
            return 31;
        }
        else
        {
            return 30;
        }
    }
}
}
 
/////////////////////////// DaysPerYear() ////////////////////////////////////
 
integer DaysPerYear(integer year)
integer DaysPerYear(integer year)
{
{
     if (LeapYear(year))
     return 365 + LeapYear(year);
        return DAYS_PER_YEAR + 1;
    else
        return DAYS_PER_YEAR;
}
}


Line 134: Line 120:


     integer month = 1;
     integer month = 1;
     integer days_per_month = DaysPerMonth(year,month);
     integer days_per_month = DaysPerMonth(year, month);
      
      
     while (day > days_per_month)
     while (day > days_per_month)
Line 146: Line 132:
         }
         }
          
          
         days_per_month = DaysPerMonth(year,month);
         days_per_month = DaysPerMonth(year, month);
     }
     }


Line 183: Line 169:
string TimeString(list timelist)
string TimeString(list timelist)
{
{
     integer hour        = llList2Integer(timelist,3);
     string  hourstr    = llGetSubString ( (string) (100 + llList2Integer(timelist, 3) ), -2, -1);
    integer minute      = llList2Integer(timelist,4);
     string  minutestr  = llGetSubString ( (string) (100 + llList2Integer(timelist, 4) ), -2, -1);
    integer second      = llList2Integer(timelist,5);
     string  secondstr  = llGetSubString ( (string) (100 + llList2Integer(timelist, 5) ), -2, -1);
     string  hourstr    = (string)hour;
     return hourstr + ":" + minutestr + ":" + secondstr;
    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;
}
}


Line 217: Line 196:
while (mt < month)
while (mt < month)
{
{
days = DaysPerMonth(mt++);
days = DaysPerMonth(year, mt++);
time += days * SECONDS_PER_DAY;
time += days * SECONDS_PER_DAY;
}
}
Line 231: Line 210:
//////////////////////////////////////////////
//////////////////////////////////////////////
// End Unix2DateTimev1.0.lsl
// End Unix2DateTimev1.0.lsl
//////////////////////////////////////////////
//////////////////////////////////////////////</source>
</pre>
</div></div>
 
<div id="box">
== Example ==
<div style="padding: 0.5em;">
Trivial example to display data and time converted from system time when touched.
<source lang="lsl2">default
{
    touch_start(integer total_number)
    {
        llOwnerSay("Date: " +  DateString(Unix2DateTime(llGetUnixTime()))); // displays date as DD-MON-YYYY
        llOwnerSay("Time: " +  TimeString(Unix2DateTime(llGetUnixTime()))); // displays time as HH24:MI:SS
    }
}</source>
</div></div>
{{LSLC|Library}}
{{LSLC|Library}}

Latest revision as of 09:14, 25 January 2015

Function: list Unix2DateTime(integer unixtime);

Returns a list of integers comprising the date [year, month, day, hour, minute, second].

• integer unixtime number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC, ie. return value of llGetUnixTime()

Function: integer DateTime2Unix(integer year,integer month,integer day,integer hour,integer minute,integer second);

Returns an integer comprising the date in number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC.

• integer year range from 1970 to 2038
• integer month range from 1 to 12
• integer day range from 1 to 31
• integer hour range from 0 to 23
• integer minute range from 0 to 59
• integer second range from 0 to 59

Function: string DateString(list time);

Returns a string comprising the date as DD-MON-YYYY.

• list time list of integers [year, month, day, hour, minute, second]

Function: string TimeString(list time);

Returns a string comprising the time as HH24:MI:SS.

• list time list of integers [year, month, day, hour, minute, second]

Specification

/////////////////////////////////////////////////////////////////////
// Script Library Contribution by Flennan Roffo
// Logic Scripted Products & Script Services
// Peacock Park (183,226,69)
// (c) 2007 - Flennan Roffo
//
// Distributed as GPL, donated to wiki.secondlife.com on 19 sep 2007
//
// SCRIPT:  Unix2DateTimev1.0.lsl
//
// FUNCTION: 
// Perform conversion from return value of llGetUnixTime() to
// date and time strings and vice versa.
//
// USAGE:
// list timelist=Unix2DateTime(llGetUnixTime());
// llSay(PUBLIC_CHANNEL, "Date: " +  DateString(timelist); // displays date as DD-MON-YYYY
// llSay(PUBLIC_CHANNEL, "Time: " +  TimeString(timelist); // displays time as HH24:MI:SS
/////////////////////////////////////////////////////////////////////

///////////////////////////// Unix Time conversion //////////////////

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;

list MonthNameList = [  "JAN", "FEB", "MAR", "APR", "MAY", "JUN", 
                        "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" ];

// This leap year test works for all years from 1901 to 2099 (yes, including 2000)
// Which is more than enough for UnixTime computations, which only operate over the range [1970, 2038].  (Omei Qunhua)
integer LeapYear( integer year)
{
    return !(year & 3);
}
 
integer DaysPerMonth(integer year, integer month)
{
    // Compact Days-Per-Month algorithm. Omei Qunhua.
    if (month == 2)  	return 28 + LeapYear(year);
    return 30 + ( (month + (month > 7) ) & 1);           // Odd months up to July, and even months after July, have 31 days
}
 
integer DaysPerYear(integer year)
{
    return 365 + LeapYear(year);
}

///////////////////////////////////////////////////////////////////////////////////////
// Convert Unix time (integer) to a Date and Time string
///////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////// Unix2DataTime() ///////////////////////////////////////

list Unix2DateTime(integer unixtime)
{
    integer days_since_1_1_1970     = unixtime / SECONDS_PER_DAY;
    integer day = days_since_1_1_1970 + 1;
    integer year  = 1970;
    integer days_per_year = DaysPerYear(year);
    
    while (day > days_per_year)
    {
        day -= days_per_year;
        ++year;
        days_per_year = DaysPerYear(year);
    }

    integer month = 1;
    integer days_per_month = DaysPerMonth(year, month);
    
    while (day > days_per_month)
    {
        day -= days_per_month;
        
        if (++month > 12)
        {    
            ++year;
            month = 1;
        }
        
        days_per_month = DaysPerMonth(year, month);
    }

    integer seconds_since_midnight  = unixtime % SECONDS_PER_DAY;
    integer hour        = seconds_since_midnight / SECONDS_PER_HOUR;
    integer second      = seconds_since_midnight % SECONDS_PER_HOUR;
    integer minute      = second / SECONDS_PER_MINUTE;
    second              = second % SECONDS_PER_MINUTE;
    
    return [ year, month, day, hour, minute, second ];
}

///////////////////////////////// MonthName() ////////////////////////////

string MonthName(integer month)
{
    if (month >= 0 && month < 12)
        return llList2String(MonthNameList, month);
    else
        return "";
}

///////////////////////////////// DateString() ///////////////////////////

string DateString(list timelist)
{
    integer year       = llList2Integer(timelist,0);
    integer month      = llList2Integer(timelist,1);
    integer day        = llList2Integer(timelist,2);
    
    return (string)day + "-" + MonthName(month - 1) + "-" + (string)year;
}

///////////////////////////////// TimeString() ////////////////////////////

string TimeString(list timelist)
{
    string  hourstr     = llGetSubString ( (string) (100 + llList2Integer(timelist, 3) ), -2, -1);
    string  minutestr   = llGetSubString ( (string) (100 + llList2Integer(timelist, 4) ), -2, -1);
    string  secondstr   = llGetSubString ( (string) (100 + llList2Integer(timelist, 5) ), -2, -1);
    return  hourstr + ":" + minutestr + ":" + secondstr;
}

///////////////////////////////////////////////////////////////////////////////
// Convert a date and time to a Unix time integer
///////////////////////////////////////////////////////////////////////////////

////////////////////////// DateTime2Unix() ////////////////////////////////////

integer DateTime2Unix(integer year, integer month, integer day, integer hour, integer minute, integer second)
{
	integer time = 0;
	integer yr = 1970;
	integer mt = 1;
	integer days;
	
	while(yr < year)
	{
		days = DaysPerYear(yr++);
		time += days * SECONDS_PER_DAY;
	}
	
	while (mt < month)
	{
		days = DaysPerMonth(year, mt++);
		time += days * SECONDS_PER_DAY;
	}
	
	days = day - 1;
	time += days * SECONDS_PER_DAY;
	time += hour * SECONDS_PER_HOUR;
	time += minute * SECONDS_PER_MINUTE;
	time += second;
	
	return time;
}
//////////////////////////////////////////////
// End Unix2DateTimev1.0.lsl
//////////////////////////////////////////////

Example

Trivial example to display data and time converted from system time when touched.

default
{ 
    touch_start(integer total_number)
    {
        llOwnerSay("Date: " +  DateString(Unix2DateTime(llGetUnixTime()))); // displays date as DD-MON-YYYY
        llOwnerSay("Time: " +  TimeString(Unix2DateTime(llGetUnixTime()))); // displays time as HH24:MI:SS
    }
}