Modul:Kalenderfunktioner
Utseende
Dokumentation [visa] [redigera] [historik] [rensa sidcachen]
local p = {}
--[[
veckostart, ger datum för första dagen (måndagen) en viss vecka ett visst år
parametrar
==========
1: årtal (yyyy)
2: veckonummer (w)
3: formateringsinformation, om ingen formateringsinformation anges används fås resultatet med formatet "Vecka w yyyy börjar yyyy-mm-dd"
exempel
=======
{{#invoke:Kalenderfunktioner|veckostart|2015|14}}
ger resultatet
Vecka 14 2015 börjar 2015-03-30
{{#invoke:Kalenderfunktioner|veckostart|2015|14|%Y-%m-%d}}
ger resultatet
2015-03-30
]]
p.veckostart = function(frame)
local y = tonumber(frame.args[1]) or 2015
local w = tonumber(frame.args[2]) or 1
local f = frame.args[3] or 'Vecka '..w..' '..y..' börjar %Y-%m-%d'
local t0 = os.time{year=y, month=1, day=1}
local w0 = os.date("*t", t0)['wday']+1
if (os.date("*t",t0 + 86400*(w*7-1-w0 % 7))['year']>y) or (w<1) then
return '<span class="error">Fel veckonummer!</span> (det finns ingen vecka med nummer '..w.. ' som börjar under ' .. y .. ').'
end
return os.date(f,t0+86400*(w*7-4-w0 % 7))
end
--[[
nteveckodag, returnerar datum för den n:te veckodagen av angiven typ i angiven månad och angivet år
parametrar
==========
1 (obligatorisk): år, till exempel 2015
2 (obligatorisk): månad, till exempel 11
3 (obligatorisk): veckodag 1-7 (1=söndag, 2=måndag, ..., 7=lördag), till exempel 5 (torsdag)
4 (obligatorisk): n, till exempel 4
exempel
=======
{{#invoke:Kalenderfunktioner|nteveckodag|2015|11|5|4}}
ger resultatet
26
Den fjärde torsdagen i november månad 2015, Thanksgiving i USA, infaller alltså den 26 november.
]]
p.nteveckodag = function(frame)
local y = tonumber(frame.args[1])
local m = tonumber(frame.args[2])
local w = tonumber(frame.args[3])
local n = tonumber(frame.args[4])
local t0 = os.time{year=y, month=m, day=1}
local w0 = os.date("*t",t0)['wday']
return tonumber(os.date("%d",t0+86400*(n*7+(w-w0)%7 -7)))
end
--[[
emanad, returnerar indata med stavning för månad som förekommer med svensk stavning översatt till engelska.
Eventuell versaliering av svenska stavningen ignoreras, såväl mars som Mars och maRS översätts till March.
Den tänkta användningen är att kompensera för att #time inte kan hantera de fyra månaderna mars, juni, juli och augusti med svensk stavning. Se mall Date.
Begränsningar:
- Endast strängar med högst en förekomst av månad kan hanteras.
- Resten av strängen konverteras till gemener som en bieffekt. Det är normalt bara siffror.
parametrar
==========
1 (obligatorisk): en sträng med högst ett månadsnamn stavat på svenska
exempel
=======
{{#invoke:Kalenderfunktioner|emanad|27 mars 2016}}
ger resultatet
27 March 2016
]]
function p.emanad(frame)
local table manader = { januari='January', februari = 'February', mars = 'March', april = 'April', maj = 'May', juni = 'June', juli = 'July', augusti = 'August', september = 'September', oktober = 'October', november = 'November', december = 'December' }
local manad = string.lower(frame.args[1] or '')
local nymanad = ''
for s, e in pairs(manader) do
nymanad = mw.ustring.gsub(manad,s,e)
if not (nymanad == manad) then return nymanad end
end
return manad
end
--[[
Paskdagsdatum, returnerar datum för Påskdagen för ett år eller en följd av år
Parametrar
==========
year (frivillig): anger det första år som datum önskas för. year måste ligga mellan 1800 och 2099. (Standardvärde = innevarande år)
year2 (frivillig): det sista år som datum önskas för. year2 måste ligga mellan 1800 och 2099. (Standarvärde = samma som första året)
länkar (frivillig): om parametern anges så fås wikilänkar till datum och till årtal. (Standardvärde = inga länkar)
prefix (frivillig): text som föregås varje datum. (Standardvärde = inget prefix)
suffix (frivillig): text som följer efter varje datum. (Standardväde = inget suffix)
nl (frivillig): antalet radmatningar efter varje datum. (Standardvärde = 0)
format (frivillig): om parametern har värdet "ISO 8601" returneras datum på formatet YYYY-MM-DD
]]
function p.Paskdagsdatum(frame)
local res = ''
local year1 = tonumber(frame.args['year'] or os.date('!*t')['year'])
local year2 = tonumber(frame.args['year2'] or year1)
local prefix = frame.args['prefix'] or ''
local suffix = frame.args['suffix'] or ''
local nl = tonumber(frame.args['nl'] or '0')
local format = frame.args['format'] or ''
local links = frame.args['länkar']
if (year1<1800) or (year1>2099) or (year2<1800) or (year2>2099) then return 'Felaktigt parameter värde i funktionsanrop. År måste vara från 1800 till 2099!' end
for year=year1,year2 do
local day, month = 0, ''
if (year==1802) then day, month = 25, 'april' end
if (year==1805) then day, month = 21, 'april' end
if (year==1818) then day, month = 29, 'mars' end
if (day==0) then
local a, b, c = math.fmod(year,19), math.fmod(year,4), math.fmod(year,7)
local m, n = 23,4
if (year>=1900) then m, n = 24, 5 end
local d = math.fmod(19*a+m,30)
local e = math.fmod(2*b+4*c+6*d+n,7)
day = 22+d+e
month = 'mars'
if ((d+e)>9) then day, month = d+e-9, 'april' end
if (day==26) and (month=='april') then day = 19 end
if (day==25) and (month=='april') and (d==28) and (e==6) and (math.fmod(11*m+11,30)<19) then day=18 end
end
if (format == 'ISO 8601') then
local monthnumber = '03'
if month == 'april' then monthnumber = '04' end
local daynumber = string.sub('0'..day,-2)
if (links) then
res = res .. prefix .. '[[' .. year .. ']]-' .. '[[' .. day .. ' ' .. month .. '|' .. monthnumber .. '-' .. daynumber ..']]' .. suffix
else
res = res .. prefix .. year .. '-' .. monthnumber .. '-' .. daynumber .. suffix
end
else
if (links) then
res = res .. prefix .. '[[' .. day .. ' ' .. month .. ']] [[' .. year .. ']]' .. suffix
else
res = res .. prefix .. day .. ' ' .. month .. ' ' .. year .. suffix
end
end
for i=1,nl do res = res .. '\n' end
end
return res
end
return p