Light-Bulb icon by Till Teenck.svg Samsynwikin reder ut begreppen. Här presenteras de väsentligaste orden för universitetens samverkan. Definitionerna mognar olika snabbt och vi tar gärna emot respons för att utveckla dem vidare. Skapa ditt användarkonto här alternativt maila till samsyn(at)su.se. Mer information: Huvudsidan.

Modul:Kalenderfunktioner

Från Samsyn
Hoppa till navigering Hoppa till sök

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
=======
Vecka 14 2015 börjar 2015-03-30
ger resultatet
Vecka 14 2015 börjar 2015-03-30
2015-03-30
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 'Fel veckonummer! (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
=======
26
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
=======
27 March 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)

]]

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 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 (links) then res = res .. prefix .. '' .. day .. ' ' .. month .. ' ' .. year .. '' .. suffix else res = res .. prefix .. day .. ' ' .. month .. ' ' .. year .. suffix end for i=1,nl do res = res .. '\n' end end return res end


return p