Gregorianske kalender: Forskelle mellem versioner

Content deleted Content added
m Gendannelse til seneste version ved TherasTaneel, fjerner ændringer fra 182.0.169.192 (diskussion | bidrag)
Tag: Tilbagerulning
m Bot: Replace deprecated <source> tag and "enclose" parameter; kosmetiske ændringer
Linje 1:
[[FileFil:2006 Calendar.JPG|thumb|Den gregorianske kalender følges i bl.a. Danmark]]
Den '''gregorianske kalender''' er den almindelige danske [[kalender]], som vi bruger til at holde styr på, hvilken dato det er i løbet af [[år]]et.
 
Linje 7:
At lave en kalender, der præcis dækker et år, giver lidt problemer, da det "tropiske år" ikke er på 365 døgn, men på 365,24219878 døgn. Da den overskydende del siden oldtiden har været erkendt til at være et kvart døgn, indførte [[Julius Cæsar]] efter forslag af grækeren [[Sosigenes]] i år [[46 f.Kr.]] den [[julianske kalender]]. Ifølge den ''julianske kalender'' skulle år delelige med tallet fire være [[skudår]], dvs. indeholde 366 dage i stedet for [[normalår]] på 365 dage. Det julianske år har derfor længden 365,25 dage.
 
Årslængden på 365,25 dage gjorde dog, at der i [[1500-tallet]] var kommet en afvigelse på ca. 10 [[døgn]]. Dette problem blev løst i [[1582]], da [[pave]] [[Gregor XIII]] indførte den ''gregorianske kalender''. Samtidig med indførelsen af denne kalender blev datoen rettet med 10 dage (den 4. oktober blev efterfulgt af den 15. oktober).
 
Det er bemærkelsesværdigt, at den gregorianske kalender blev fastlagt, medens det (fejlagtige) [[geocentrisk]]e [[verdensbillede]] endnu var det vedtagne.
Linje 15:
Denne beregningsmetode giver en årslængde på i snit 365,2425 dage, meget tæt på det ønskede. Denne kalender giver kun en fejl på ca. 3 dage på 10.000 år.
 
I Danmark blev den gregorianske kalender indført den [[1. marts]] [[1700]] efter forarbejde af [[Ole Rømer]]. Man stoppede med brug af den julianske kalender den [[18. februar]], (altså et spring i datoen på 11 dage).
 
Den ''gregorianske kalender'' blev imidlertid indført af paven kort efter [[Luther]] og [[reformationen]], så mange protestantiske og ortodokse fyrstedømmer og lande valgte først at indføre den nye kalender meget senere for ikke at give indrømmelser over for modparten.
Storbritannien indførte den nye kalender i [[1752]]. [[Sverige]] og [[Finland]] overgik til kalenderen i 1753 ved at udelade 11 dage af året, den [[17. februar]] [[1753]], som derved blev til den [[1. marts]].
 
Linje 36:
 
=== Opbygning af algoritme ===
Skal man til at beregne ugedag, eller antal dage mellem
to datoer i den gregorianske kalender, vil en algoritme kun give fornuftige data, såfremt
man tager hensyn til hvilket land det drejer sig om, og datoen
Linje 44:
Det første, man opdager ved at se på kalenderen, er, at den er opbygget
af [[år]], [[måned]]er, og [[dag]]e, hvor der ikke umiddelbart ser ud til
at være nogen pæn [[lineær]] sammenhæng. Et [[brute force]] kodet program til
ugedagsberegning vil derfor kunne komme til at bestå af mange "if/case"
konstruktioner til at tage højde for de forskellige regler.
 
For at undgå dette indser man at der må laves en anden skala, f.eks.
Linje 54:
på følgende måde:
 
<sourcesyntaxhighlight lang="c">
/* der benyttes heltals divison ! */
Faktor = 365*ÅR + (ÅR-1)/4 – (ÅR-1)/100 + (ÅR-1)/400 ;
</syntaxhighlight>
</source>
 
Forkortes lidt fås:
Linje 69:
ej, når den aktuelle "faktor" skal udregnes for en given dato.
Derefter mangler der kun at skabe en lineær sammenhæng mellem
dag i året og aktuel måned og dag. Hvis man starter med at tælle
fra marts, får man følgende tabel:
 
Linje 110:
følgende:
 
<sourcesyntaxhighlight lang="c">
/* der benyttes heltals divison ! */
if (Måned < 3 ) {
Linje 119:
Faktor = 365*ÅR + ÅR/4 - ((ÅR/100)*3)/4 + tabel[Måned] + Dag.
}
</syntaxhighlight>
</source>
 
Tabellen kan forenkles noget. Tegner man tabellen på [[millimeterpapir]],
og gives januar og februar henholdsvis månedsnummeret 13 og 14, vil man opdage,
at man (næsten) kan tegne en ret linje gennem de plottede punkter.
Ved enten at aflæse eller ved at benytte [[lineær regression]],
Linje 129:
m = 30,6013986 , b = -91,77855478 .
 
Ved beregningen fremkom [[korrelationskoefficient]]en 0,999996, som er
et ganske godt resultat, da 1,00 ville være fuldkommen korrelation.
Tabellen fra før kan derfor erstattes med:
 
<sourcesyntaxhighlight lang="c">
 
round ( Måned*30,60 – 91,78 )
= Int ( Måned*30,60 – 91,78 + 0,5 )
= Int ( Måned*30,60 – 91,28 )
</syntaxhighlight>
</source>
 
For ikke at skulle benytte [[reelle tal]] (float), udregnes det hele
i en heltal udgave, og samtidig forenkles beregningen ved januar
og februar. Den færdige rutine bliver så:
<sourcesyntaxhighlight lang="c">
/* ------------------- factor -----------------------------*/
#define LONGWORD unsigned int
Linje 156:
return 365UL*y + y/4UL – ((y/100+1)*3)/4 + (m*3060-9135)/100 + tm->day + 59;
}
</syntaxhighlight>
</source>
 
Datastrukturen for RTCtime er lavet for at holde lidt styr på
Linje 167:
at søndag er ugedag nr. 0, skal der først adderes 6 til faktoren.
 
<sourcesyntaxhighlight lang="c">
 
/*------------------- weekday ------------------------------*/
Linje 175:
return (int) ( (factor(tm)+6) % 7UL );
}
</syntaxhighlight>
</source>
 
=== Beregning af antal dage mellem to datoer ===
Linje 189:
Ved indtastning af datoer er der ofte behov for at kontrollere
om datoen er gyldig, så f.eks. datoer som d. 29. februar 1995 eller
31. april ikke accepteres. Året kontrolleres på sædvanlig vis, evt.
suppleret med, at det for Danmark skal være fra og med marts 1700.
Måneden er nem at kontrollere, idet det selvfølgelig er et tal
Linje 197:
til at foretage en sådan kontrol er ''date_ok()''.
 
<sourcesyntaxhighlight lang="c">
/*------------------- date_ok ------------------------------*/
int date_ok(RTCtime *t)
Linje 214:
else return (int) f1; /* if ok return days in month */
}
</syntaxhighlight>
</source>
 
=== Adder N dage til en dato, og udregn den nye dato ===
 
Det nemmeste er at udregne ''factor()'' for datoen og addere de N dage:
 
F = factor(dato) + N ;
 
Derefter divideres med 365.2425, og det fremkomne tal skulle gerne være
årstallet:
ÅR= F * 10000UL / 3652425UL;
Linje 234:
 
Måneden findes lettes ved at udregne Fm = factor(1.MD.ÅR) for alle
måneder startende med MD=1, indtil Fm > F. Dagen kan så findes
som differencen mellem Fm og F.