Modul:Datum

Aus KoschWiki
Zur Navigation springen Zur Suche springen
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Dokumentation und Testfälle unter Modul:Datum/Doku.
 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 eine tabelle mit den perioden zurück, damit es nicht mehrfach definiert werden muss
 local getperiodentable= function()
  result={}
  result[ 1]={von=-999999999, per= "Periode01", name= "Vorzeiten" }
  result[ 2]={von= -17000000, per= "Periode02", name= "Besiedlungszeit" }
  result[ 3]={von=  -5659999, per= "Periode03", name= "Dunkle Zeiten und spätes Altes Reich" }
  result[ 4]={von=       207, per= "Periode04", name= "Reichsgründung" }
  result[ 5]={von=    539999, per= "Periode05", name= "Zeit der Klugen Kaiser" }
  result[ 6]={von=   3350320, per= "Periode06", name= "Priesterkaiserzeit" }
  result[ 7]={von=   4659999, per= "Periode07", name= "Rohalszeit und Magierkriege" }
  result[ 8]={von=   5959999, per= "Periode08", name= "Frühe Almadaner Dynastie" }
  result[ 9]={von=   7729999, per= "Periode09", name= "Späte Almadaner Dynastie" }
  result[10]={von=   9029999, per= "Periode10", name= "Kaiserlose Zeiten" }
  result[11]={von=   9329999, per= "Periode11", name= "Pervals Regierungszeit" }
  result[12]={von=   9489999, per= "Periode12", name= "Bardos und Cellas Regierungszeit" }
  result[13]={von=   9749999, per= "Periode13", name= "Retos Regierungszeit" }
  result[14]={von=   9920315, per= "Periode14", name= "Hals Regierungszeit" }
  result[15]={von=  10100909, per= "Periode15", name= "Answinkrise und Orkenzug" }
  result[16]={von=  10140618, per= "Periode16", name= "Brins Regierungszeit und Borbaradkrieg" }
  result[17]={von=  10211123, per= "Periode17", name= "Emers Regierungszeit und Jahr des Feuers" }
  result[18]={von=  10280915, per= "Periode18", name= "Rohajas Regierungszeit in der Konsolidierung" }
  result[19]={von=  10300101, per= "Periode19", name= "Rohajas Regierungszeit unter Staatsrat Schroeckh" }
  result[20]={von=  10351211, per= "Periode20", name= "Rohajas Regierungszeit unter Cantzler Luring" }
  result[21]={von=  10460101, per= "Periode21", name= "Rohajas Regierungszeit unter Großfürst Alderan" }
  result["min"]=1
  result["max"]=21
  return result
 end

 --Gibt die Periode nach dem Jahr, Monat, Tag zurück
 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