Modul:Kalenderfunktioner

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) donymanad = mw.ustring.gsub(manad,s,e)if not (nymanad == manad) then return nymanad endendreturn manadend--[[   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!' endfor year=year1,year2 dolocal day, month = 0, ''if (year==1802) then day, month = 25, 'april' endif (year==1805) then day, month = 21, 'april' endif (year==1818) then day, month = 29, 'mars' endif (day==0) thenlocal 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        elseif (links) then res = res .. prefix .. '[[' .. day .. ' ' .. month .. ']] [[' .. year .. ']]' .. suffix elseres = res .. prefix .. day .. ' ' .. month .. ' ' .. year .. suffixendendfor i=1,nl do res = res .. '\n' endendreturn resendreturn p