Here's the script I'm using. It sends the updated time to an XYtext object (visually shows the time without using hovertext)
------------------------------------------------------
string zero_pad(integer number)
{
if (number < 10) return "0" + (string)number;
else return (string)number;
}
string format_time(integer seconds)
{
integer days = llFloor(seconds / 86400);
seconds -= days * 86400;
integer hours = llFloor(seconds / 3600);
seconds -= hours * 3600;
integer minutes = llFloor(seconds / 60);
seconds -= minutes * 60;
return (string)days+":" +zero_pad(hours) + ":" + zero_pad(minutes) + ":" + zero_pad(seconds);
}
integer gCountdown = 0; //863999
integer settingsline = 0;
key settingsID;
string temp1;
string temp2;
list time1;
list time2;
integer seconds1;
integer seconds2;
integer startup = FALSE;
integer switch = 0;
default
{
state_entry()
{
startup = TRUE;
llMessageLinked(LINK_SET, 100110, "0:00:00:00", ""

;
settingsID = llGetNotecardLine("Settings", 1);
}
touch(integer times)
{
settingsID = llGetNotecardLine("Settings", 1);
}
timer()
{
if (gCountdown > 0)
llMessageLinked(LINK_ALL_OTHERS, 100110, format_time(--gCountdown), ""

;
else
llMessageLinked(LINK_ALL_OTHERS, 100110, "0:00:00:00", ""

;
if (gCountdown == 0)
{
if (switch == 0)
{
if (seconds2 > 0)
gCountdown = seconds2;
switch = 1;
return;
}
if (switch == 1)
{
if (seconds1 > 0)
gCountdown = seconds1;
switch = 0;
return;
}
}
}
dataserver(key query_id, string data)
{
if (query_id == settingsID) if (data != EOF)
{
if (settingsline == 1)
{
temp1 = (string)data;
time1 = llParseString2List(temp1,[":"],[""]);
seconds1 += (llList2Integer(time1,0)*86400); //days
seconds1 += (llList2Integer(time1,1)*3600); //hours
seconds1 += (llList2Integer(time1,2)*60); //minutes
seconds1 += llList2Integer(time1,3); //seconds
settingsline = 3;
}
if (settingsline == 4)
{
temp2 = (string)data;
time2 = llParseString2List(temp2,[":"],[""]);
seconds2 += (llList2Integer(time2,0)*86400); //days
seconds2 += (llList2Integer(time2,1)*3600); //hours
seconds2 += (llList2Integer(time2,2)*60); //minutes
seconds2 += llList2Integer(time2,3); //seconds
llOwnerSay("New times are now set.\nChange the times on the settings page then touch me to set new times."

;
if (startup == TRUE)
{
switch = 0;
gCountdown = seconds1;
llSetTimerEvent(1);
startup = FALSE;
}
data = EOF;
}
++settingsline;
settingsID = llGetNotecardLine("Settings", settingsline);
}
}
}
--------------------------
This countdown timer reads two times from the settings page. then counts down the first, then counts down the second, then starts on the first again...ect.