Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
1

os.time - How to use it?

Asked by 10 years ago

I was looking in the blog and it started talking about os.time. I wondered how it outputted so I put in the command line in the in-game console and this happened: 03EFF218 So I tried it in studio and: 0x15af5670 Is this a table or something? Obviously it's not supposed to be a string. How would I use os.time?

0
Pay close attention to the output: "function: 0D767DE0" the word before the numbers tells you that it's a function (not a table or something) BlueTaslem 18071 — 10y

2 answers

Log in to vote
1
Answered by
BlueTaslem 18071 Moderation Voter Administrator Community Moderator Super Administrator
10 years ago

Time is a very difficult to rigorously define.

The standard way that it is done is by counting the number of seconds from some particular, special moment in history.

tick() counts the number of seconds since the beginning of 1970 in your time zone.

os.clock() does a similar thing. However, it measures universal time meaning it references the beginning of 1970 GMT, regardless of which timezone the computer is in.

os.clock() is also an integer, while tick() provides a fraction of a second.


Here's a function that computes the day, year, etc, approximately, given the two functions:

-- The rule for whether or not `year` is a leap year.
function isleap(year)
    if year % 400 == 0 then
        return true;
    elseif year % 100 == 0 then
        return false;
    elseif year % 4 == 0 then
        return true;
    end
    return false;
end

function calendar( t )
    -- t is seconds since beginning of 1970
    local minutes = t / 60;
    local hours = minutes / 60;
    local days = hours / 24;
    local week = (days % 7 + 4) % 7;
    -- Weekday; 0 Su, 1 Mo, 6 Sa.
    -- Year / month is annoying because of leapyears:
    local dayStart = 0;
    local year;
    for y = 1970, 2100 do
        local len = 365;
        if isleap(y) then
            len = 366;
        end
        dayStart = dayStart + len;
        if dayStart > days then
            year = y;
            dayStart = dayStart - len;
            break;
        end
    end
    hours = hours % 24;
    minutes = minutes % 60;
    days = days - dayStart;
    local mos = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    local monthStart = 0;
    if isleap(year) then
        mos[2] = 29;
        days = days % 366;
    else
        days = days % 365;
    end
    for mo = 1, 12 do
        monthStart = monthStart + mos[mo];
        if monthStart > days then
            monthStart = monthStart - mos[mo];
            month = mo;
            break;
        end
    end
    local date = days - monthStart;
    print("Today's Date:");
    local monthName = {
        "January", "February", "March", "April", "May", "June", "July",
        "August", "September", "October", "November", "December"
    };
    print(math.floor(date) + 1, monthName[month], year);
    print(math.floor(hours), ":", math.floor(minutes));
end

calendar( os.time() );
--Today's Date:
-- 12 December 2014
-- 19 : 40

calendar( tick() );
-- Today's Date:
-- 12 December 2014
-- 14 : 40

os.time() results in the time in GMT (English time).

tick() results in my local time (EST)


Time is bad. If you can, avoid dealing with it. Using HTTP service to query some web service about time information might almost be a better option.

Or, finding a library that deals with it properly (I'm sure there is one, somewhere)

Ad
Log in to vote
1
Answered by
adark 5487 Badge of Merit Moderation Voter Community Moderator
10 years ago

os.time is actually a function, not a readable value.

print(os.time()) --seconds passed since the UNIX epoch, UTC

If you call it with a table of parameters, you can get the seconds since the passed-in time.

0
Could you give me an example? lightpower26 399 — 10y
1
It's a *function*. *Methods* are on *instances* of objects and thus usually use the :method() notation. BlueTaslem 18071 — 10y

Answer this question