hvordan man beregner den dag i ugen for ethvert år

Indlæg af Alice Hansen     opdateret: 2012-02-02

En fælles algoritme til at beregne ugedag en bestemt dato er Zeller 's algoritme . Algoritmen blev offentliggjort i 1882 og beregnet til at blive bearbejdet i hånden , men kan nemt implementeres i software . Zeller 's algoritme fungerer ved at finde den dag i ugen århundredet begyndte , da bygningen derfra ved at tilføje år , måneder og dage . En god forståelse af modulo aritmetik er nødvendig for at forstå , hvordan algoritmen fungerer , men alle kan implementere den ved at følge anvisningerne
1 .
Forbered indgange . Den algoritme forventer en dag, måned og år .
Zeller 's algoritme numre månederne fra tre til 14 , begyndende med marts og slutter med februar . Dette garanterer, at spring dag altid falder i slutningen af året , forenkle beregningerne .
hvis måned <3 derefter , måned=måned + 12
2 .

Beregn århundrede og det år, hvor tallet . Århundredet for 1950 bør være 19 , selv om det falder i det tyvende århundrede .
århundrede=gulvet ( år /100 )
yearOfCentury=år mod 100
3 .
Find den dag i ugen , hvor tallet begyndte .
dayOfWeek=gulvet ( tallet /4 ) + 5 * århundrede
Zeller fastslået, at denne beregning , modulo syv , vil give den dag i ugen , at enhver given århundrede begyndte . Gulvet Beregningen håndterer det faktum , at hver fjerde århundrede er kort en skuddag .
4 .
Beregn dag i ugen , at året begyndte den .
dayOfWeek=dayOfWeek + yearOfCentury + gulv ( yearOfCentury /4 )
Hvert år starter den næste dag i ugen end i det foregående år , bortset fra skudår . Denne beregning , modulo syv , giver den dag i ugen fra den første dag i året .
5 .
Find den dag i ugen , at måneden startede .

dayOfWeek=dayOfWeek + gulv ( ( måned + 1) * 26) /10)
Dette er hjertet af Zeller 's algoritme . Zeller bemærkede, at denne beregning er i stand til at afgøre på hvilken dag i ugen en måned vil starte . Det eliminerer behovet for opslagstabeller at bestemme længden af hver måned .
6 .
Tilsæt dag i måneden og beregne ugedag , hvor den dato falder .
dayOfWeek=dayOfWeek + dag
dayOfWeek=dayOfWeek mod 7
7 .
Konverter dato til ISO uge moderne normer .

ISO uger dato dag-for-uge starter med mandag=1 . Zeller 's algoritme bruger Lørdag=0 . Konverteringen bruger enkle modulo aritmetik .
dayOfWeek=( ( dayOfWeek + 5 ) mod 7 ) + en

gode råd og advarsler


  • Denne algoritme virker kun for gregorianske datoer . For ældre datoer , vil en anden beregning ikke være nødvendigt.


  • Previous:hvordan man beregner det Hamming kode Next:hvordan man åbner en postsættet



     

    Kommentarer

    Code:
    change