X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/cf0cc951c06f50ff9390eca662f13d4887c83114..e3d5c044607a407cc2ec0975f233879c71c50f94:/src/timetable.lua?ds=sidebyside diff --git a/src/timetable.lua b/src/timetable.lua index df78b15..c71c59b 100644 --- a/src/timetable.lua +++ b/src/timetable.lua @@ -72,9 +72,8 @@ local function unpack_tm ( tm ) tm.sec or 0 end -local function normalise ( tm ) - local year , month , day , hour , min , sec = unpack_tm ( tm ) - +-- Modify parameters so they all fit within the "normal" range +local function normalise ( year , month , day , hour , min , sec ) min , sec = increment ( min , sec , 60 ) -- TODO: consider leap seconds? hour , min = increment ( hour , min , 60 ) day , hour = increment ( day , hour , 24 ) @@ -96,22 +95,56 @@ local function normalise ( tm ) year , month = increment ( year , month - 1 , 12 ) month = month + 1 - tm.sec = sec - tm.min = min - tm.hour = hour - tm.day = day - tm.month = month - tm.year = year + return year , month , day , hour , min , sec +end + +local function timestamp ( year , month , day , hour , min , sec ) + return 60*60*24*( + year * year_length ( year ) + + month * month_length ( month , year ) + + day + ) + + hour * (60*60) + + min * 60 + + sec +end + + +local timetable_methods = { } + +function timetable_methods:normalise ( ) + local year , month , day + year , month , day , self.hour , self.min , self.sec = normalise ( unpack_tm ( self ) ) + + self.day = day + self.month = month + self.year = year local yday = day_of_year ( day , month , year ) local wday = day_of_week ( yday , year ) - tm.yday = yday - tm.wday = wday + self.yday = yday + self.wday = wday + + return self +end +timetable_methods.normalize = timetable_methods.normalise -- American English - return tm +function timetable_methods:timestamp ( ) + return timestamp ( unpack_tm ( self ) ) end + +function timetable_methods:rfc_3339 ( ) + -- %06.4g gives 3 (=6-4+1) digits after decimal + return strformat ( "%04u-%02u-%02uT%02u:%02u:%06.4g" , unpack_tm ( self ) ) +end + local timetable_mt = { + __index = timetable_methods ; + __tostring = timetable_methods.rfc_3339 ; + __eq = function ( a , b ) + return a:timestamp() < b:timestamp() + end ; } local function cast_timetable ( tm ) @@ -132,6 +165,7 @@ end return { doomsday = doomsday ; normalise = normalise ; + timestamp = timestamp ; new = new_timetable ; cast = cast_timetable ;