Module:Time ago
Appearance
| This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing. |
| This module is currently protected from editing. See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected. |
| This Lua module is used on approximately 197,000 pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
The module “Time ago” implements {{Time ago}}. See the template's page for documentation. Test cases can be found at Template:Time ago/testcases.
-- Replacement for [[Template:Time ago]]
local HtmlBuilder = require('Module:HtmlBuilder')
local p = {}
function p.timeAgo( frame )
local lang = mw.language.getContentLanguage()
local purge = ''
if ( frame.args.purge ) then
local builder = HtmlBuilder.create()
builder
.wikitext(' ')
.tag('span')
.addClass('plainlinks')
.wikitext('([' .. mw.title.getCurrentTitle().fullUrl('action=purge') .. ' purge])')
.done()
purge = tostring(builder)
end
local noError, inputTime = pcall( lang.formatDate, lang, 'U', frame.args[1] )
if not noError then
local builder = HtmlBuilder.create()
builder
.tag('strong')
.addClass('error')
.wikitext('Error: first parameter cannot be parsed as a date or time.')
.done()
return tostring(builder) .. purge
end
local timeDiff = lang:formatDate( 'U' ) - inputTime
local magnitude = frame.args.magnitude
local min_magnitude = frame.args.min_magnitude
local auto_magnitude_num
local min_magnitude_num
local result
if frame.args.ago then ago = frame.args.ago else ago = 'ago' end
if magnitude then
auto_magnitude_num = 0
min_magnitude_num = timeText[magnitude]
else
if ( math.floor( math.abs( timeDiff ) / 120 ) > 0 ) then
auto_magnitude_num = 1
else
auto_magnitude_num = 0
end
if ( math.floor( math.abs( timeDiff ) / 7200 ) > 0 ) then auto_magnitude_num = 2 end
if ( math.floor( math.abs( timeDiff ) / 172800 ) > 0 ) then auto_magnitude_num = 3 end
if ( math.floor( math.abs( timeDiff ) / 5356800 ) > 0 ) then auto_magnitude_num = 5 end
if ( math.floor( math.abs( timeDiff ) / 63115200 ) > 0 ) then auto_magnitude_num = 6 end
if min_magnitude then min_magnitude_num = timeText[min_magnitude] else min_magnitude_num = -1 end
end
if not min_magnitude_num then min_magnitude_num = 0 end
local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )
if ( timeDiff >= 0 ) then
if ( magnitude_num == 0 ) then result = math.floor ( math.abs( timeDiff ) ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) ), { 'second', 'seconds' } )
elseif ( magnitude_num == 1 ) then result = math.floor ( math.abs( timeDiff ) / 60 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 60 ), { 'minute', 'minutes' } )
elseif ( magnitude_num == 2 ) then result = math.floor ( math.abs( timeDiff ) / 3600 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 3600 ), { 'hour', 'hours' } )
elseif ( magnitude_num == 3 ) then result = math.floor ( math.abs( timeDiff ) / 86400 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 86400 ), { 'day', 'days' } )
elseif ( magnitude_num == 4 ) then result = math.floor ( math.abs( timeDiff ) / 604800 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 604800 ), { 'week', 'weeks' } )
elseif ( magnitude_num == 5 ) then result = math.floor ( math.abs( timeDiff ) / 2678400 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 2678400 ), { 'month', 'months' } )
elseif ( magnitude_num == 6 ) then result = math.floor ( math.abs( timeDiff ) / 31557600 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 31557600 ), { 'year', 'years' } ) end
result = result .. ' ' .. ago
else
if ( magnitude_num == 0 ) then result = math.floor ( math.abs( timeDiff ) ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) ), { 'second\'s', 'seconds\'' } )
elseif ( magnitude_num == 1 ) then result = math.floor ( math.abs( timeDiff ) / 60 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 60 ), { 'minute\'s', 'minutes\'' } )
elseif ( magnitude_num == 2 ) then result = math.floor ( math.abs( timeDiff ) / 3600 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 3600 ), { 'hour\'s', 'hours\'' } )
elseif ( magnitude_num == 3 ) then result = math.floor ( math.abs( timeDiff ) / 86400 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 86400 ), { 'day\'s', 'days\'' } )
elseif ( magnitude_num == 4 ) then result = math.floor ( math.abs( timeDiff ) / 604800 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 604800 ), { 'week\'s', 'weeks\'' } )
elseif ( magnitude_num == 5 ) then result = math.floor ( math.abs( timeDiff ) / 2678400 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 2678400 ), { 'month\'s', 'months\'' } )
elseif ( magnitude_num == 6 ) then result = math.floor ( math.abs( timeDiff ) / 31557600 ) .. ' ' .. lang:plural( math.floor ( math.abs( timeDiff ) / 31557600 ), { 'year\'s', 'years\'' } ) end
result = result .. ' time'
end
return result .. purge
end
timeText = {
["seconds"] = 0,
["minutes"] = 1,
["hours"] = 2,
["days"] = 3,
["weeks"] = 4,
["months"] = 5,
["years"] = 6,
}
return p