X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/88cbee758e827b9b3a1c9a6be61f1fc3d65b6575..bab202dc11e948f75e617b39024dc67f9a11691f:/src/timetable.lua diff --git a/src/timetable.lua b/src/timetable.lua index c71c59b..1ce701c 100644 --- a/src/timetable.lua +++ b/src/timetable.lua @@ -1,3 +1,4 @@ +local strformat = string.format local floor = math.floor local function idiv ( n , d ) return floor ( n / d ) @@ -27,9 +28,13 @@ local function month_length ( m , y ) end end +local function leap_years_since ( year ) + return idiv ( year , 4 ) - idiv ( year , 100 ) + idiv ( year , 400 ) +end + local function doomsday ( year ) return ( 3 -- Tuesday - - 1 + year + idiv ( year , 4 ) - idiv ( year , 100 ) + idiv ( year , 400 ) ) + - 1 + year + leap_years_since ( year ) ) % 7 + 1 end local doomsday_cache = setmetatable ( { } , { @@ -98,12 +103,16 @@ local function normalise ( year , month , day , hour , min , sec ) return year , month , day , hour , min , sec end +local leap_years_since_1970 = leap_years_since ( 1970 ) local function timestamp ( year , month , day , hour , min , sec ) - return 60*60*24*( - year * year_length ( year ) - + month * month_length ( month , year ) - + day - ) + year , month , day , hour , min , sec = normalise ( year , month , day , hour , min , sec ) + + local days_since_epoch = day_of_year ( day , month , year ) + + 365 * ( year - 1970 ) + -- Each leap year adds one day + + ( leap_years_since ( year - 1 ) - leap_years_since_1970 ) - 1 + + return days_since_epoch * 60*60*24 + hour * (60*60) + min * 60 + sec @@ -143,6 +152,9 @@ local timetable_mt = { __index = timetable_methods ; __tostring = timetable_methods.rfc_3339 ; __eq = function ( a , b ) + return a:timestamp() == b:timestamp() + end ; + __lt = function ( a , b ) return a:timestamp() < b:timestamp() end ; } @@ -162,12 +174,17 @@ local function new_timetable ( year , month , day , hour , min , sec ) } end +local function new_from_timestamp ( ts ) + return new_timetable ( 1970 , 1 , 1 , 0 , 0 , ts ) +end + return { doomsday = doomsday ; normalise = normalise ; timestamp = timestamp ; new = new_timetable ; + new_from_timestamp = new_from_timestamp ; cast = cast_timetable ; timetable_mt = timetable_mt ; }