Hvordan beregne for ethvert Day of the Week

Hvordan beregne for ethvert Day of the Week


En vanlig algoritme for å beregne den dagen i uken i en bestemt dato er Zeller algoritme. Algoritmen ble publisert i 1882 og utformet for å bli bearbeidet ved hånden, men kan lett implementeres i programvare. Zeller algoritme fungerer ved å finne den dag i uken århundret startet, for så å bygge derfra ved å legge til år, måneder og dager. En god forståelse av modulo aritmetikk er nødvendig for å forstå hvordan det fungerer algoritmen, men hvem som helst kan gjennomføre det ved å følge instruksjonene.

Bruksanvisning

1 Forbered inngangene. Algoritmen forventer en dag, måned og år.

Zeller algoritme tall månedene fra tre til 14, og starter med mars og slutter med februar. Dette garanterer at spranget dager alltid falle på slutten av året, forenkle beregninger.

Hvis måned <3 da, måned = måned + 12

2 Beregn tallet og året av århundret. Det tallet for 1950 skal være 19, selv om det faller i det tjuende århundre.

tallet = etasje (år / 100)
yearOfCentury = år mod 100

3 Finne den ukedag hvor det århundre begynte.

dayOfWeek = etasje (tallet / 4) + 5 * århundre

Zeller fastslått at denne beregningen, modulo syv, vil gi den ukedag som en gitt århundre begynte. Beregningen gulvet håndterer det faktum at hver fjerde århundre er kort ett sprang dag.

4 Beregn dag i uken at året startet på.

dayOfWeek = dayOfWeek + yearOfCentury + etasje (yearOfCentury / 4)

Hvert år starter på neste dag i uken enn i foregående år, med unntak av skuddår. Denne beregningen, modulo syv, gir den ukedag av den første dagen i året.

5 Finn den dag i uken som måneden startet på.

dayOfWeek = dayOfWeek + etasje ((måned + 1) * 26) / 10)

Dette er hjertet av Zeller algoritme. Zeller observert at denne beregningen er i stand til å avgjøre på hvilken dag i uken i måneden starter. Det eliminerer behovet for oppslagstabeller for å bestemme lengden av hver måned.

6 Legg den dagen i måneden og beregne ukedag som datoen faller.

dayOfWeek = dayOfWeek + dag
dayOfWeek = dayOfWeek mod 7

7 Konverter datoen til ISO uke date standarder.

ISO uke date dag-of-uker starter med mandag = 1. Zeller algoritme bruker Lørdag = 0. konvertering bruker enkle modulo aritmetikk.

dayOfWeek = ((dayOfWeek + 5) mod 7) + 1

Hint

  • Denne algoritmen fungerer bare for gregorianske datoer. For eldre dato, vil en annen beregnings være nødvendig.