09-30-2007 06:09
For time calculations the Unix time value (seconds since midnight 1-1-1970 UTC) is very handy, but for displaying time it is not. Here are some conversion routines that you can use to display the date and time. Handy for example to display the date and time an email was received, since the email event uses the unix time.

CODE

/////////////////////////////////////////////////////////////////////
// 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(0, "Date: " + DateString(timelist); // displays date as DD-MON-YYYY
// llSay(0, "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" ];

////////////////////////////// LeapYear() /////////////////////////////

integer LeapYear(integer year)
{
if (year % 4 == 0)
{
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)
{
if (month < 8)
{
if (month % 2 == 0)
{
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)
{
if (LeapYear(year))
return DAYS_PER_YEAR + 1;
else
return DAYS_PER_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)
{
integer hour = llList2Integer(timelist,3);
integer minute = llList2Integer(timelist,4);
integer second = llList2Integer(timelist,5);
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;
}

///////////////////////////////////////////////////////////////////////////////
// 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
//////////////////////////////////////////////


Also see:


I plan to create a new version which accepts a date/time format string and the unix time to display the date/time in the format asked, with formatting elements like 'YYYY', ÝEAR', 'MM', 'MON', 'MONTH', 'DD', 'DAY', 'HH24', 'HH', 'MI', 'SS', etc. Any part of the format string which is not a formatting element will be taken literal and become part of the string returned.