Modul:Datum
Zur Navigation springen
Zur Suche springen
Dokumentation und Testfälle unter Modul:Datum/Doku.
require("Modul:Datum Periode") local p = {} --Erwartet einen Zahlenwert und gibt den Wochentag zurück -- Wochentag w=1 bis 7 --Rückgabe -- Wochentag -- Leerstring bei illegalen Werten local getWochentagLang=function(w) if (w== 1) then return "Rohalstag" end if (w== 2) then return "Feuertag" end if (w== 3) then return "Wassertag" end if (w== 4) then return "Windstag" end if (w== 5) then return "Erdtag" end if (w== 6) then return "Markttag" end if (w== 7) then return "Praiostag" end return "" end --Erwartet einen Zahlenwert und gibt den Planet des Wochentages zurück -- Wochentag w=1 bis 7 --Rückgabe -- Planet des Wochentages -- Leerstring bei illegalen Werten local getWochentagPlanet=function(w) if (w== 1) then return "Nandus" end if (w== 2) then return "Kor" end if (w== 3) then return "Marbo" end if (w== 4) then return "Aves" end if (w== 5) then return "Simia" end if (w== 6) then return "Horas" end if (w== 7) then return "Ucuri" end return "" end --Erwartet einen Zahlenwert und gibt den Planet des Monatsfünftels zurück -- Tag t=1 bis 30 --Rückgabe -- Planet des Monatsfünftels -- Leerstring bei illegalen Werten local getMonatsfuenftelPlanet=function(t) if (t<1) or (t>30) then return "" end f=1+math.floor((t-1)/6) if (f== 1) then return "Simia" end if (f== 2) then return "Aves" end if (f== 3) then return "Kor" end if (f== 4) then return "Ucuri" end if (f== 5) then return "Marbo" end return "" end --Erwartet einen Zahlenwert und gibt den Planet des Tages im Monatsfünftel zurück -- Tag t=1 bis 30 --Rückgabe -- Planet des Tags im Monatsfünftels -- Leerstring bei illegalen Werten local getMonatstagPlanet=function(t) if (t<1) or (t>30) then return "" end f=1+(t-1)%6 if (f== 1) then return "Horas" end if (f== 2) then return "Simia" end if (f== 3) then return "Levthan" end if (f== 4) then return "Kor" end if (f== 5) then return "Ucuri" end if (f== 6) then return "Marbo" end return "" end --Erwartet einen Zahlenwert und gibt das Sternbild des Monats zurück -- Monat m=1 bis 13 --Rückgabe -- Sternbild des Monats -- Leerstring bei illegalen Werten local getMonatsSternbild=function(m) if (m== 1) then return "Greif" end if (m== 2) then return "Schwert" end if (m== 3) then return "Delfin" end if (m== 4) then return "Gans" end if (m== 5) then return "Rabe" end if (m== 6) then return "Schlange" end if (m== 7) then return "Eisbär" end if (m== 8) then return "Eidechse" end if (m== 9) then return "Fuchs" end if (m==10) then return "Storch" end if (m==11) then return "Hammer und Amboss" end if (m==12) then return "Stute" end if (m==13) then return "Sternenleere" end return "" end --Erwartet einen Zahlenwert und gibt den vollständigen Monat zurück -- Monat m=1 bis 13 --Rückgabe -- Monat -- Leerstring bei illegalen Werten local getMonatLang=function(m) if (m== 1) then return "Praios" end if (m== 2) then return "Rondra" end if (m== 3) then return "Efferd" end if (m== 4) then return "Travia" end if (m== 5) then return "Boron" end if (m== 6) then return "Hesinde" end if (m== 7) then return "Firun" end if (m== 8) then return "Tsa" end if (m== 9) then return "Phex" end if (m==10) then return "Peraine" end if (m==11) then return "Ingerimm" end if (m==12) then return "Rahja" end if (m==13) then return "Namenloser" end return "" end --Erwartet einen Zahlenwert und gibt den dreibuchstabigen Monat zurück -- Monat m=1 bis 13 --Rückgabe -- dreibuchstabiger Monat -- Leerstring bei illegalen Werten local getMonatKurz=function(m) if (m== 1) then return "Pra" end if (m== 2) then return "Ron" end if (m== 3) then return "Eff" end if (m== 4) then return "Tra" end if (m== 5) then return "Bor" end if (m== 6) then return "Hes" end if (m== 7) then return "Fir" end if (m== 8) then return "Tsa" end if (m== 9) then return "Phe" end if (m==10) then return "Per" end if (m==11) then return "Ing" end if (m==12) then return "Rah" end if (m==13) then return "Nam" end return "" end --Erwartet einen Zahlenwert und gibt den Stundennamen -- Stunde h=0 bis 23 -- Genauigkeit g --Rückgabe -- Stundenname -- Leerstring bei illegalen Werten local getStundeBeschreibung=function(h,g) if(g<=2) then if (h== 0) then return "zur nächtlichen Praiosstunde" end if (h== 1) then return "zur nächtlichen Rondrastunde" end if (h== 2) then return "zur nächtlichen Efferdstunde" end if (h== 3) then return "zur nächtlichen Traviastunde" end if (h== 4) then return "zur morgendlichen Boronstunde" end if (h== 5) then return "zur morgendlichen Hesindestunde" end if (h== 6) then return "zur morgendlichen Firunstunde" end if (h== 7) then return "zur morgendlichen Tsastunde" end if (h== 8) then return "zur morgendlichen Phexstunde" end if (h== 9) then return "zur morgendlichen Perainestunde" end if (h==10) then return "zur mittäglichen Ingerimmstunde" end if (h==11) then return "zur mittäglichen Rahjastunde" end if (h==12) then return "zur mittäglichen Praiosstunde" end if (h==13) then return "zur mittäglichen Rondrastunde" end if (h==14) then return "zur mittäglichen Efferdstunde" end if (h==15) then return "zur mittäglichen Traviastunde" end if (h==16) then return "zur abendlichen Boronstunde" end if (h==17) then return "zur abendlichen Hesindestunde" end if (h==18) then return "zur abendlichen Firunstunde" end if (h==19) then return "zur abendlichen Tsastunde" end if (h==20) then return "zur abendlichen Phexstunde" end if (h==21) then return "zur abendlichen Perainestunde" end if (h==22) then return "zur nächtlichen Ingerimmstunde" end if (h==23) then return "zur nächtlichen Rahjastunde" end end if (g==3) then if (h>= 0) and (h<= 1) then return "mitten in der Nacht" end if (h>= 2) and (h<= 3) then return "spät in der Nacht" end if (h>= 4) and (h<= 5) then return "früh am Morgen" end if (h>= 6) and (h<= 7) then return "mitten am Morgen" end if (h>= 8) and (h<= 9) then return "spät am Morgen" end if (h>=10) and (h<=11) then return "früh am Mittag" end if (h>=12) and (h<=13) then return "mitten am Mittag" end if (h>=14) and (h<=15) then return "spät am Mittag" end if (h>=16) and (h<=17) then return "früh am Abend" end if (h>=18) and (h<=19) then return "mitten am Abend" end if (h>=20) and (h<=21) then return "spät am Abend" end if (h>=22) and (h<=23) then return "früh in der Nacht" end end if (g==4) then if (h>=22) or (h<= 3) then return "in der Nacht" end if (h>= 4) and (h<= 9) then return "am Morgen" end if (h>=10) and (h<=15) then return "am Mittag" end if (h>=16) and (h<=21) then return "am Abend" end end return "" end --Erwartet vier Zahlenwerte und gibt den Wochentag je nach Genauigkeit als String zurück -- Tag t=1 bis 30 (bzw. 5 bei m=13) -- Monat m=1 bis 13 -- Jahr j=minInt bis maxInt -- Genauigkeit g=-2 bis -1 --Rückgabe -- Wochentag plus ", " -- Leerstring bei illegalen Werten local getWochentag=function(t,m,j,g) if (m<1) or (m>13) or (t<1) or (t>30) or (g>=0) then return 0 end --Tag des Jahres d=(m-1)*30+t w=(d+j+5)%7 return (w+1) end --Erwartet drei Zahlenwerte und gibt den Tag je nach Genauigkeit als String zurück -- Tag t=1 bis 30 (bzw. 5 bei m=13) -- Monat m=1 bis 13 -- Genauigkeit g=0 bis 1 --Rückgabe -- entweder Zahl plus ". " bei g==0 -- oder Anfang/Mitte/Ende (bzw. leer bei m=13) bei g==1 -- Leerstring bei illegalen Werten local getTagBeschreibung=function(t,m,g) if (m<1) or (m>13) or (t<1) or (t>30) or (g>1) then return "" end if (g<=0) then return t..". " end if (m==13) then return "" end if (t<=10) then return "Anfang " end if (t>=21) then return "Ende " end return "Mitte " end --Erwartet zwei Zahlenwerte und gibt den Monat je nach Genauigkeit als String zurück -- Monat m=1 bis 13 -- Genauigkeit g=0 bis 3 --Rückgabe -- entweder Monatskürzel bei g==0 bis g==2 -- oder Frühling/Sommer/Herbst/Winter bei g==3 -- Leerstring bei illegalen Werten local getMonatBeschreibung=function(m,g) if (m<1) or (m>13) or (g>3) then return "" end if (g<0) then return getMonatLang(m).." " end if (g<3) then return getMonatKurz(m).." " end if (m<3) then return "Sommer am Anfang " end if((m>=3)and(m<=5)) then return "Herbst " end if((m>=6)and(m<=8)) then return "Winter " end if((m>=9)and(m<=11)) then return "Frühling " end return "Sommer am Ende " end --Erwartet zwei Zahlenwerte und gibt das Jahr je nach Genauigkeit als String zurück -- Jahr j=minInt bis maxInt -- Genauigkeit g=0 bis 9 --Rückgabe -- entweder Jahr plus " BF" bzw. " vBF" bei g==0 bis g==4 -- oder "er Jahre (v)BF" bei g==5 -- oder "Anfang/Mitte/Ende x. Jhd. (v)BF" bei g==6 -- oder "x. Jhd. (v)BF" bei g==7 -- oder "Anfang/Mitte/Ende x. Jtd. (v)BF" bei g==8 -- oder "x. Jtd. (v)BF" bei g==9 -- Leerstring bei illegalen Werten local getJahrBeschreibung=function(j,g) if (g>9) then return "" end v=false; k=" BF" if (j<0) then k=" vBF" j=-j v=true end js=j if(g==5) then jr=10*math.floor(j/10) js=jr.."er Jahre" end if((g==6)or(g==7)) then jr=math.floor(j/100)+1 jd=j-((jr-1)*100) jds="Mitte " if((v==false) and (jd<=33)) then jds="Anfang " end if((v==true) and (jd<=33)) then jds="Ende " end if((v==false) and (jd>=67)) then jds="Ende " end if((v==true) and (jd>=67)) then jds="Anfang " end if(g==7) then jds="" end js=jds..jr..". Jhd." end if((g==8)or(g==9)) then jr=math.floor(j/1000)+1 jd=j-((jr-1)*1000) jds="Mitte " if((v==false) and (jd<=333)) then jds="Anfang " end if((v==true) and (jd<=333)) then jds="Ende " end if((v==false) and (jd>=667)) then jds="Ende " end if((v==true) and (jd>=667)) then jds="Anfang " end if(g==9) then jds="" end js=jds..jr..". Jts." end return js..k end --Erwartet t,m,j des aventurischen Datums plus Genauigkeit g von 0 bis 11 und gibt ein formatiertes Ergebnis zurück local formatdatum=function(t,m,j,g) w=getWochentag(t,m,j,g) as="" ws="" as=getWochentagPlanet(w)..", "..getMonatstagPlanet(t)..", "..getMonatsfuenftelPlanet(t)..", "..getMonatsSternbild(m) if (as==", , , ") then as="" end; if (g==-3) then return as end if (g==-2) and (as~="") then as=" ("..as..")" else as="" end if (w>=1) and (w<=7) then ws=getWochentagLang(w)..", "; end ts=getTagBeschreibung(t,m,g) ms=getMonatBeschreibung(m,g) js=getJahrBeschreibung(j,g) res=ws..ts..ms..js..as if (res=="")and(g==10) then res="unbekannt" end return res end --Erwartet h,m,s der aventurischen Zeit plus Genauigkeit g und gibt ein formatiertes Ergebnis zurück local formatzeit=function(h,m,s,g) hs=getStundeBeschreibung(h,g) --0: Format "17:43:25 Uhr" if g==0 then return string.format("%02d:%02d:%02d",h,m,s)..' Uhr' end --1: Format "17:43 Uhr" if g==1 then return string.format("%02d:%02d",h,m)..' Uhr' end --2: Format "zur abendlichen Hesindestunde" --3: Format "früh am Abend" --4: Format "am abend" if (g>=2)and(g<=4) then return hs end if (g==5) then return "unbekannte Zeit" end return "" end --Erwartet t,m,j des aventurischen Datums plus Genauigkeit g von 0 bis 9 und gibt ein formatiertes Ergebnis zurück local indextag=function(t,m,j,g) r=m*100+t s=tostring(r) if (m<10) then s='0'..s end return s end --Erwartet t,m,j des aventurischen Datums plus Genauigkeit g von 0 bis 9 und gibt ein formatiertes Ergebnis zurück local indexdatum=function(t,m,j,g) return j*10000+m*100+t end --Gibt das aktuelle Datum als array['tag','monat','jahr','genauigkeit'=0] zurück local aktuellesdatum=function() actdate=os.date('*t') datum={} datum['error']=nil year=tonumber(actdate.year) datum['jahr']=year-977; yday=tonumber(actdate.yday) datum['monat']=math.floor((yday-1)/30)+1 datum['tag']=(yday-1)%30+1 datum['genauigkeit']=0 return datum end --Alter local alter=function(t1,m1,j1,t2,m2,j2,g,num) i1=j1*365+(m1-1)*30+t1 i2=j2*365+(m2-1)*30+t2 at=i2-i1 if (at<0) then return '' end j=math.floor(at/365) if num then return j end if(g<=4) then if (j==1) then return "1 Jahr" end return j.." Jahre" end if(g<=6) then jr=10*math.floor(j/10) return "über "..jr.." Jahre" end if(g<=8) then jr=100*math.floor(j/100) return "über "..jr.." Jahre" end if(g<=9) then jr=1000*math.floor(j/1000) return "über "..jr.." Jahre" end return "unbekannt" end --Dekodiert ein Datum im Format [[T.]M.]J[/G] local decodedatum=function(s) datg=mw.text.split(s,'/',true) if(#datg<2) then table.insert(datg,0) end dat=mw.text.split(datg[1],'.',true) while(#dat<3) do table.insert(dat,0,0) end result={} result['genauigkeit']=tonumber(datg[2]) result['error']=nil result['jahr']=tonumber(dat[3]) result['monat']=tonumber(dat[2]) result['tag']=tonumber(dat[1]) if(result['genauigkeit']==nil) then result['error']="Genauigkeit muss eine Zahl sein." end if(result['jahr']==nil) then result['error']="Jahr muss eine Zahl sein." end if(result['monat']==nil) then result['error']="Monat muss eine Zahl sein." end if(result['tag']==nil) then result['error']="Tag muss eine Zahl sein." end return result end --Dekodiert eine Zeit im Format HH:[MM[:SS]][/G], Heuristik für das alte Nummernformat HHMM local decodezeit=function(s) datg=mw.text.split(s,'/',true) if(#datg<2) then table.insert(datg,0) end olddate=false dat=mw.text.split(datg[1],':',true) if(mw.ustring.len(dat[1])<=2) then while(#dat<3) do table.insert(dat,0) end else dat[1]=mw.ustring.sub(datg[1],1,2) dat[2]=mw.ustring.sub(datg[1],-2) dat[3]='00' olddate=true end result={} result['genauigkeit']=tonumber(datg[2]) result['error']=nil result['stunde']=tonumber(dat[1]) result['minute']=tonumber(dat[2]) result['sekunde']=tonumber(dat[3]) if(result['genauigkeit']==nil) then result['error']="Genauigkeit muss eine Zahl sein." end if(result['stunde']==nil) then result['error']="Stunde muss eine Zahl sein." end if(result['minute']==nil) then result['error']="Minute muss eine Zahl sein." end if(result['sekunde']==nil) then result['error']="Sekunde muss eine Zahl sein." end if(olddate) then result['genauigkeit']=2 end return result end --Gibt die Periode nach dem Jahr, Monat, Tag zurück --Die Periodentabelle ist im "Modul:Datum Periode" damit sie Wiki-spezifisch angepasst werden kann local periode=function(t,m,j,g) if (g>=8) then return "Unbekannt" end index=t+m*100+j*10000 perioden=getperiodentable() for p = perioden.max, perioden.min+1, -1 do if (index>perioden[p].von) then return perioden[p].name end end return perioden[perioden.min].name end --Gibt die Periodenzahl nach dem Jahr, Monat, Tag zurück local periodenzahl=function(index) perioden=getperiodentable() for p = perioden.max, perioden.min+1, -1 do if (index>perioden[p].von) then return perioden[p].per end end return perioden[perioden.min].per end --Gibt die vorhergehende Periode zurück local periodevorgaenger=function(name) perioden=getperiodentable() for p = perioden.max, perioden.min+1, -1 do if (name==perioden[p].name) then return perioden[p-1].name end end return "" end --Gibt die nachfolgende Periode zurück local periodenachfolger=function(name) perioden=getperiodentable() for p = perioden.max-1, perioden.min, -1 do if (name==perioden[p].name) then return perioden[p+1].name end end return "" end --Gibt das Anfangsjahr einer Periode zurück local periodeanfang=function(name) perioden=getperiodentable() for p = perioden.max, perioden.min, -1 do if (name==perioden[p].name) then return perioden[p].von end end return perioden[perioden.min].von end --Gibt das Endjahr einer Periode zurück local periodeende=function(name) perioden=getperiodentable() if (name==perioden[perioden.max].name) then return 999999999 end for p = perioden.max-1, perioden.min, -1 do if (name==perioden[p].name) then return perioden[p+1].von end end return perioden[perioden.min+1].von end function p.formatzeitindex() frame=mw.getCurrentFrame() zeit=tonumber(frame.args['ZeitIndex']) if (tonumber(zeit)==nil) then return "" end gnau=tonumber(frame.args['Genauigkeit']) j=math.floor(zeit/10000) m=math.floor((zeit-j*10000)/100) t=zeit-j*10000-m*100 return formatdatum(t,m,j,gnau) end function p.DatumTextTMJG() frame=mw.getCurrentFrame() dat=frame.args['Datum'] if(dat=='') then return '' end if(dat==nil) then return '' end datum=decodedatum(dat) gen=frame.args['Genauigkeit'] if(gen=='') then gen=datum['genauigkeit'] end if(gen==nil) then gen=datum['genauigkeit'] end if(type(gen)~='number') then gen=tonumber(gen) end if(datum['error']==nil) then return formatdatum(datum['tag'],datum['monat'],datum['jahr'],gen) else return datum['error'] end end function p.DatumIndexTMJG() frame=mw.getCurrentFrame() dat=frame.args['Datum'] if(dat=='') then return '' end if(dat==nil) then return '' end datum=decodedatum(dat) if(datum['error']==nil) then return indexdatum(datum['tag'],datum['monat'],datum['jahr'],datum['genauigkeit']) else return datum['error'] end end function p.DatumPeriodeTMJG() frame=mw.getCurrentFrame() dat=frame.args['Datum'] if(dat=='') then return '' end if(dat==nil) then return '' end datum=decodedatum(dat) if(datum['error']==nil) then return periode(datum['tag'],datum['monat'],datum['jahr'],datum['genauigkeit']) else return datum['error'] end end function p.DatumPeriodenzahlTMJG() frame=mw.getCurrentFrame() dat=frame.args['DatumIndex'] if(dat=='') then return '' end if(dat==nil) then return '' end return periodenzahl(tonumber(dat)) end function p.DatumPeriodeVorgaenger() frame=mw.getCurrentFrame() name=frame.args['Name'] if(name=='') then return '' end if(name==nil) then return '' end return periodevorgaenger(name) end function p.DatumPeriodeNachfolger() frame=mw.getCurrentFrame() name=frame.args['Name'] if(name=='') then return '' end if(name==nil) then return '' end return periodenachfolger(name) end function p.DatumPeriodeAnfang() frame=mw.getCurrentFrame() name=frame.args['Name'] if(name=='') then return '' end if(name==nil) then return '' end return periodeanfang(name) end function p.DatumPeriodeEnde() frame=mw.getCurrentFrame() name=frame.args['Name'] if(name=='') then return '' end if(name==nil) then return '' end return periodeende(name) end function p.DatumTagTMJG() frame=mw.getCurrentFrame() dat=frame.args['Datum'] if(dat=='') then return '' end if(dat==nil) then return '' end datum=decodedatum(dat) if(datum['error']==nil) then return indextag(datum['tag'],datum['monat'],datum['jahr'],datum['genauigkeit']) else return datum['error'] end end function p.DatumAlterTMJG() frame=mw.getCurrentFrame() dat1=frame.args['Tsa'] dat2=frame.args['Boron'] num=frame.args['Nummer'] if((num=='')or(num==nil)) then num=false else num=true end if((dat1=='')or(dat1==nil)) then return '' end datum1=decodedatum(dat1) if((dat2=='')or(dat2==nil)) then datum2=aktuellesdatum() else datum2=decodedatum(dat2) end if((datum1['error']==nil)and(datum2['error']==nil)) then g=math.max(datum1['genauigkeit'],datum2['genauigkeit']); return alter(datum1['tag'],datum1['monat'],datum1['jahr'], datum2['tag'],datum2['monat'],datum2['jahr'],g,num) else if(datum1['error']==nil) then datum1['error']='' end if(datum2['error']==nil) then datum2['error']='' end return datum1['error']..datum2['error'] end end function p.DatumAktuell() frame=mw.getCurrentFrame() g=frame.args['Genauigkeit'] if((g=='')or(g==nil)) then g='0' end gen=tonumber(g) datum=aktuellesdatum() return formatdatum(datum['tag'],datum['monat'],datum['jahr'],gen) end function p.DatumAktuellTag() frame=mw.getCurrentFrame() datum=aktuellesdatum() return indextag(datum['tag'],datum['monat'],datum['jahr'],datum['genauigkeit']) end function p.DatumSortierwert() frame=mw.getCurrentFrame() dat=frame.args['Datum'] if(dat=='') then return '' end if(dat==nil) then return '' end zet=frame.args['Zeit'] if(zet=='') then zet='0' end if(zet==nil) then zet='0' end datum=decodedatum(dat) if(datum['monat']<1) then datum['monat']=1 end if(datum['tag']<1) then datum['tag']=1 end zeit=decodezeit(zet) if(datum['error']==nil) then result=datum['jahr']*365+(datum['monat']-1)*30+(datum['tag']-1)+(zeit['stunde']*60*60+zeit['minute']*60+zeit['sekunde'])/86400 resultstring=tostring(result) split=mw.text.split(resultstring,'.',true) if(#split~=2) then return resultstring end return split[1]..","..split[2] else return datum['error'] end end function p.DatumSortierwertE() frame=mw.getCurrentFrame() dat=frame.args['Datum'] if(dat=='') then return '' end if(dat==nil) then return '' end zet=frame.args['Zeit'] if(zet=='') then zet='0' end if(zet==nil) then zet='0' end datum=decodedatum(dat) zeit=decodezeit(zet) if(datum['error']==nil) then result=datum['jahr']*365+(datum['monat']-1)*30+(datum['tag']-1)+(zeit['stunde']*60*60+zeit['minute']*60+zeit['sekunde'])/86400 resultstring=tostring(result) return resultstring else return datum['error'] end end function p.ZeitTextHMSG() frame=mw.getCurrentFrame() zet=frame.args['Zeit'] if(zet=='') then return '' end if(zet==nil) then return '' end zeit=decodezeit(zet) gen=frame.args['Genauigkeit'] if(gen=='') then gen=zeit['genauigkeit'] end if(gen==nil) then gen=zeit['genauigkeit'] end if(type(gen)~='number') then gen=tonumber(gen) end if(zeit['error']==nil) then return formatzeit(zeit['stunde'],zeit['minute'],zeit['sekunde'],gen) else return zeit['error'] end end return p