local strftime = require "luatz.strftime".strftime
local strformat = string.format
local floor = math.floor
-local function idiv ( n , d )
- return floor ( n / d )
+local idiv do
+ -- Try and use actual integer division when available (Lua 5.3+)
+ local idiv_loader = (loadstring or load)([[return function(n,d) return n//d end]], "idiv") -- luacheck: ignore 113
+ if idiv_loader then
+ idiv = idiv_loader()
+ else
+ idiv = function(n, d)
+ return floor(n/d)
+ end
+ end
end
tens = tens + idiv ( units , base )
units = units % base
elseif units < 0 then
- tens = tens - 1 + idiv ( -units , base )
- units = base - ( -units % base )
+ tens = tens + idiv ( units , base )
+ units = ( base + units ) % base
end
return tens , units
end
end
function timetable_methods:rfc_3339 ( )
- -- %06.3f gives 3 (=6-3) digits after decimal
- return strformat ( "%04u-%02u-%02uT%02u:%02u:%06.3f" , self:unpack ( ) )
+ local year, month, day, hour, min, fsec = self:unpack()
+ local sec, msec = borrow(fsec, 0, 1000)
+ msec = math.floor(msec)
+ return strformat ( "%04u-%02u-%02uT%02u:%02u:%02d.%03d" , year , month , day , hour , min , sec , msec )
end
function timetable_methods:strftime ( format_string )
if type ( ts ) ~= "number" then
error ( "bad argument #1 to 'new_from_timestamp' (number expected, got " .. type ( ts ) .. ")" , 2 )
end
- return new_timetable ( 1970 , 1 , 1 , 0 , 0 , ts )
+ return new_timetable ( 1970 , 1 , 1 , 0 , 0 , ts ):normalise ( )
end
return {