Bestemmelse av ukedag - Determination of the day of the week

Den fastsettelse av dagen i uken for noen dato kan utføres med en rekke algoritmer . I tillegg krever evige kalendere ingen beregning av brukeren, og er i hovedsak oppslagstabeller. En typisk applikasjon er å beregne ukedagen da noen ble født eller en bestemt hendelse skjedde.

Begreper

I numerisk beregning er ukedagene representert som ukedagstall. Hvis mandag er den første dagen i uken, kan dagene bli kodet 1 til 7, for mandag til søndag, slik det praktiseres i ISO 8601 . Dagen angitt med 7 kan også regnes som 0 ved å bruke aritmetisk modulo 7, som beregner resten av et tall etter divisjon med 7. Dermed blir tallet 7 behandlet som 0, 8 som 1, 9 som 2, 18 som 4 og så videre. Hvis søndag regnes som dag 1, er 7 dager senere (dvs. dag 8) også en søndag, og dag 18 er den samme som dag 4, som er en onsdag siden dette faller tre dager etter søndag.

Standard mandag tirsdag onsdag Torsdag fredag lørdag søndag Eksempler på bruk
ISO 8601 1 2 3 4 5 6 7 %_ISODOWI%,%@ISODOWI []%( 4DOS ); DAYOFWEEK () ( HP Prime )
0 1 2 3 4 5 6
2 3 4 5 6 7 1 % UDAG I UKEN% ( NetWare , DR-DOS ); %_DOWI%,%@DOWI []%( 4DOS )
1 2 3 4 5 6 0 HPs økonomiske kalkulatorer

Den grunnleggende tilnærmingen til nesten alle metodene for å beregne ukedagen begynner med å starte fra en 'ankerdato': et kjent par (for eksempel 1. januar 1800 som en onsdag), som bestemmer antall dager mellom den kjente dagen og dagen du prøver å bestemme, og bruker aritmetisk modulo 7 for å finne en ny numerisk ukedag.

En standard tilnærming er å slå opp (eller beregne, ved hjelp av en kjent regel) verdien av den første dagen i uken i et gitt århundre, slå opp (eller beregne, ved hjelp av en kongruensmetode) en justering for måneden, beregne antall skuddår siden begynnelsen av århundret, og legg dem deretter sammen med antall år siden begynnelsen av århundret, og dagnummeret i måneden. Til slutt ender man opp med en dagtelling som man bruker modulo 7 for å bestemme ukedagen i datoen.

Noen metoder gjør alle tilleggene først og kaster ut syv, mens andre kaster dem ut ved hvert trinn, som i Lewis Carrolls metode . Uansett er ganske levedyktig: førstnevnte er lettere for kalkulatorer og dataprogrammer, sistnevnte for mental beregning (det er fullt mulig å gjøre alle beregningene i hodet med litt øvelse). Ingen av metodene som er gitt her, utfører avstandskontroller, så urimelige datoer vil gi feilaktige resultater.

Tilsvarende dager

Hver syvende dag i en måned har samme navn som den forrige:

Dag
i måneden
d
00 07 14 21 28 0
01 08 15 22 29 1
02 09 16 23 30 2
03 10 17 24 31 3
04 11 18 25 4
05 12 19 26 5
06 13 20 27 6

Tilsvarende måneder

"Tilsvarende måneder" er de månedene i kalenderåret som starter samme ukedag. For eksempel korresponderer september og desember, fordi 1. september faller på samme dag som 1. desember (da det er nøyaktig tretten 7-dagers uker mellom de to datoene). Måneder kan bare korrespondere hvis antall dager mellom de første dagene er delelig med 7, eller med andre ord, hvis de første dagene er et helt antall uker fra hverandre. For eksempel tilsvarer februar i et vanlig år mars, fordi februar har 28 dager, et tall som kan deles med 7, og 28 dager er nøyaktig fire uker. I et skuddår tilsvarer januar og februar andre måneder enn i et vanlig år, siden det å legge til 29. februar betyr at hver påfølgende måned starter en dag senere.

Januar tilsvarer oktober i vanlige år og april og juli i skuddår. Februar tilsvarer mars og november i vanlige år og august i skuddår. Mars tilsvarer alltid november, april tilsvarer alltid juli, og september tilsvarer alltid desember. August tilsvarer ingen annen måned i et fellesår. Oktober tilsvarer ingen annen måned i et skuddår. Mai og juni tilsvarer aldri noen annen måned.

I månedstabellen nedenfor har tilsvarende måneder det samme tallet, et faktum som følger direkte av definisjonen.

Vanlige år Skuddår m
Jan okt Okt 0
Kan Kan 1
Aug Feb. Aug 2
Feb mar nov Mar nov 3
Juni Juni 4
September des September des 5
April juli Jan Apr juli 6

Tilsvarende år

Det er syv mulige dager som et år kan begynne på, og skuddår vil endre ukedagen etter 29. februar. Dette betyr at det er 14 konfigurasjoner som et år kan ha. Alle konfigurasjonene kan refereres til med en dominisk bokstav , men ettersom 29. februar ikke har tildelt noen bokstav, har et skuddår to dominiske bokstaver, en for januar og februar og den andre (ett skritt tilbake i alfabetisk rekkefølge) for mars til Desember.

2021 er et vanlig år som starter på fredag, noe som betyr at det tilsvarer kalenderåret 2010. De to første månedene i 2021 tilsvarer de to første månedene i 2016. 2022 er et vanlig år som starter på lørdag, noe som betyr at det tilsvarer kalenderåret 2011. De siste ti månedene i 2022 tilsvarer de siste ti månedene i 2016. 2023 er et vanlig år som starter på søndag, noe som betyr at det tilsvarer kalenderåret 2017. 2024 er et skuddår som starter på mandag, noe som betyr at det tilsvarer kalenderåret 1996. De to første månedene i 2024 tilsvarer de to første månedene i 2018. De siste ti månedene i 2024 tilsvarer de siste ti månedene i 2019.

Hvert skuddår gjentas hvert 28. år, og hvert vanlige år gjentas hvert sjette år og to ganger hvert 11. år. For eksempel var den siste forekomsten av et skuddår som startet onsdag 2020 og neste forekomst vil være 2048. På samme måte vil de neste vanlige årene som starter på fredag ​​være 2027, 2038 og deretter 2049. Begge disse utsagnene er sanne med mindre en skuddår hoppes over, men det vil ikke skje før i 2100.

Se tabellen nedenfor for detaljer.

Year of the
århundre mod 28
y
00 06 12 17 23 0
01 07 12 18 24 1
02 08 13 19 24 2
03 08 14 20 25 3
04 09 15 20 26 4
04 10 16 21 27 5
05 11 16 22 00 6

Merknader:

  • Svart betyr alle månedene i fellesåret
  • Rød betyr de to første månedene av skuddåret
  • Blått betyr de siste 10 månedene av skuddåret

Tilsvarende århundrer

Julian århundre
mod 700
Gregoriansk århundre
mod 400
Dag
400: 1100 1800 ... 300: 1500 1900 ... Sol
300: 1000 1700 ... Man
200 0900 1600 ... 200: 1800 2200 ... Tir
100 0800 1500 ... Ons
700: 1400 2100 ... 100: 1700 2100 ... Tor
600: 1300 2000 ... Fre
500: 1200 1900 ... 000: 1600 2000 ... Lør

"År 000" er, i normal kronologi, året 1 f.Kr. (som går før AD 1). I astronomisk årstall kommer året 0 mellom 1 f.Kr. og AD 1. I den proleptiske julianske kalenderen , (det vil si den julianske kalenderen som den ville ha vært hvis den hadde fungert riktig fra starten), starter 1 f.Kr. på torsdag. I den proleptiske gregorianske kalenderen , (såkalt fordi den ikke ble utformet før i 1582), starter 1 f.Kr. på lørdag.

Tabellmetoder for å beregne ukedagen

Komplett tabell: julianske og gregorianske kalendere

For Julian -datoer før 1300 og etter 1999 bør året i tabellen som er forskjellig med et eksakt multiplum på 700 år brukes. For gregorianske datoer etter 2299 bør året i tabellen som skiller seg med et eksakt multiplum på 400 år brukes. Verdiene " r0 " til " r6 " indikerer resten når hundrevisverdien er delt på henholdsvis 7 og 4, som indikerer hvordan serien strekker seg i begge retninger. Både julianske og gregorianske verdier er vist 1500-1999 for enkelhets skyld. Fet tall (f.eks. 04 ) angir skuddår. Hvis et år slutter på 00 og hundrevisene er i fet skrift, er det et skuddår. Dermed indikerer 19 at 1900 ikke er et gregoriansk skuddår, (men 19 i den julianske kolonnen indikerer at det er et juliansk skuddår, som alle juliansk x 00 år). 20 indikerer at 2000 er et skuddår. Bruk Jan og Feb kun i skuddår.

Hundrevis av år Gjenværende tall Måned D
o
W
#
Julian
(r ÷ 7)
Gregoriansk
(r ÷ 4)
r5 19 16 20 r0 00 06 17 23 28 34 45 51 56 62 73 79 84 90 Jan Okt Sa 0
r4 18 15 19 r3 01 07 12 18 29 35 40 46 57 63 68 74 85 91 96 Kan Su 1
r3 17
Ikke tilgjengelig
02 13 19 24 30 41 47 52 58 69 75 80 86 97 Feb Aug M 2
r2 16 18 22 r2 03 08 14 25 31 36 42 53 59 64 70 81 87 92 98 Feb Mar Nov Tu 3
r1 15
Ikke tilgjengelig
  09 15 20 26   37 43 48 54   65 71 76 82   93 99 Juni W 4
r0 14 17 21 r1 04 10 21 27 32 38 49 55 60 66 77 83 88 94 Sep Des Th 5
r6 13
Ikke tilgjengelig
05 11 16 22 33 39 44 50 61 67 72 78 89 95 Jan Apr Jul F 6

For fastsettelse av ukedag (1. januar 2000, lørdag)

  • dagen i måneden: 1 ~ 31 (1)
  • måneden: (6)
  • året: (0)
  • århundret mod 4 for den gregorianske kalenderen og mod 7 for den julianske kalenderen (0) .
  • legge til 1+6+0+0 = 7. Å dele med 7 etterlater resten av 0, så ukedagen er lørdag.

Formelen er w = (d + m + y + c) mod 7.

Revidert juliansk kalender

Vær oppmerksom på at datoen (og dermed ukedagen) i de reviderte julianske og gregorianske kalenderne er den samme fra 14. oktober 1923 til 28. februar 2800 e.Kr. og at det i store år kan være mulig å trekke fra 6300 eller et multiplum av disse før starter for å nå et år som er innenfor eller nærmere bordet.

For å slå opp ukedagen i en hvilken som helst dato for et år ved å bruke tabellen, trekker du 100 fra året, deler differansen med 100, multipliserer den resulterende kvoten (utelater brøk) med syv og deler produktet med ni. Legg merke til kvoten (utelater brøk). Skriv inn tabellen med det julianske året, og like før den siste divisjonen legger du til 50 og trekker fra kvoten som er angitt ovenfor.

Eksempel: Hva er ukedagen 27. januar 8315?

8315−6300 = 2015, 2015−100 = 1915, 1915/100 = 19 resten 15, 19 × 7 = 133, 133/9 = 14 resten 7. 2015 er 700 år foran 1315, så 1315 brukes. Fra tabell: for hundrevis (13): 6. For gjenværende siffer (15): 4. For måned (januar): 0. For dato (27): 27. 6 + 4 + 0 + 27 + 50 - 14 = 73 . 73/7 = 10 rester 3. Ukedag = tirsdag.

Dominisk brev

For å finne det dominiske brevet , beregner du ukedagen for enten 1. januar eller 1. oktober. Hvis det er søndag, er den dominiske bokstaven A, hvis lørdag B, og på samme måte bakover gjennom uken og fremover gjennom alfabetet til mandag, som er G.

Sprangår har to søndagsbrev, så for januar og februar beregner du ukedagen for 1. januar og for mars til desember, beregner du ukedagen for 1. oktober.

Sprangår er alle år som deler nøyaktig med fire med følgende unntak:

I den gregorianske kalenderen - alle år som deler nøyaktig med 100 (andre enn de som deler nøyaktig med 400).

I den reviderte julianske kalenderen - alle år som deler nøyaktig med 100 (andre enn de som gir resten 200 eller 600 når de er delt på 900).

"Dommedagen"

Dette er en gjenstand for fritidsmatematikk. Se dommedagens regel for en forklaring.

Sjekk resultatet

Bruk denne tabellen for å finne ukedagen uten beregninger.

Indeks Man
A.
Tir
B.
Ons
C
Tor
D.
Fre
E.
Lør
F
Sun
G
Evig gregoriansk og juliansk kalender
Bruk Jan og Feb i skuddår
Dato bokstav i år rad for bokstaven i århundre rad

Alle C -dagene er dommedager

Julianske
århundre
Gregoriansk
århundre
Dato 01
08
15
22
29
02
09
16
23
30
03
10
17
24
31
04
11
18
25

05
12
19
26

06
13
20
27

07
14
21
28

12 19 16 20 Apr Jul Jan G EN B C D E F 01 07 12 18 29 35 40 46 57 63 68 74 85 91 96
13 20 Sep Des F G EN B C D E 02 1. 3 19 24 30 41 47 52 58 69 75 80 86 97
14 21 17 21 Juni E F G EN B C D 03 08 14 25 31 36 42 53 59 64 70 81 87 92 98
15 22 Feb Mar Nov D E F G EN B C 09 15 20 26 37 43 48 54 65 71 76 82 93 99
16 23 18 22 Aug Feb C D E F G EN B 04 10 21 27 32 38 49 55 60 66 77 83 88 94
17 24 Kan B C D E F G EN 05 11 16 22 33 39 44 50 61 67 72 78 89 95
18 25 19 23 Jan Okt EN B C D E F G 06 17 23 28 34 45 51 56 62 73 79 84 90 0 0
[År/100] Gregoriansk
århundre
20
16
21
17
22
18
23
19
Årsmodell 100
Julianske
århundre
19
12
20
13
21
14
22
15
23
16
24
17
25
18

Eksempler:

  • For vanlig metode
26. desember 1893 (GD)

Desember er i rad F og 26 er i kolonne E , så brevet for datoen C ligger i rad F og kolonne E . 93 (år mod 100) ligger i rad D (rad år), og bokstaven C i året rad ligger i kolonne G . 18 ([år/100] i den gregorianske århundrets kolonne) er i rad C (århundreraden) og bokstaven i århundreraden og kolonnen G er B, så ukedagen er tirsdag.

13. oktober 1307 (JD)

13. oktober er en F -dag. Bokstaven F i år rad (07) ligger i kolonne G . Bokstaven i århundreraden (13) og kolonne G er E, så ukedagen er fredag.

1. januar 2000 (GD)

1. januar tilsvarer G, G i årrekke ( 0 0) tilsvarer F i århundreraden ( 20 ), og F tilsvarer lørdag.

En liten formel for metoden: "Dato bokstav (G), bokstav (G) er i årrekke ( 0 0) for bokstaven (F) i århundre rad ( 20 ), og for dagen blir bokstaven (F) til hverdag (lørdag) " .

Søndagsbrevmetoden

Hver dag i året (bortsett fra 29. februar) er det tildelt et brev i den gjentagende sekvensen ABCDEFG. Serien begynner med A 1. januar og fortsetter til A igjen 31. desember. Søndagsbrevet er det som står imot alle søndagene i året. Siden 29. februar ikke har noen bokstav, betyr dette at søndagsbrevet for mars til desember er et skritt tilbake i sekvensen sammenlignet med det for januar og februar. Bokstaven for en hvilken som helst dato vil bli funnet der raden som inneholder måneden (i svart) til venstre for "Latin square" møter kolonnen som inneholder datoen over "Latin square". Søndagsbrevet vil bli funnet der kolonnen som inneholder århundret (under "Latin square") møter raden som inneholder årets to siste sifre til høyre for "Latin square". I et skuddår er søndagsbrevet dermed funnet det som gjelder mars til desember.

Så, for eksempel, for å finne ukedagen 16. juni 2020:

Kolonne "20" møter rad "20" ved "D". Rad "juni" møter kolonne "16" ved "F". Som F er to bokstaver på fra D, så er ukedagen to dager fra søndag, dvs. tirsdag.

Matematiske algoritmer

Rata Die

Trivielle Rata Die metoden fungerer ved å legge opp antall dager d som har gått siden en dato for kjente ukedag D . Dagen of-the-uken er da gitt ved ( D + d ) mod 7 , i overensstemmelse med hva konvensjon ble brukt til å kode D .

Denne metoden er dyrere enn nødvendig, og er ikke praktisk for menneskelig beregning. IBM har brukt en Rata Die -metode i sitt REXX -programmeringsspråk ved å bruke den kjente basedatoen 1. januar, AD 1, en mandag.

For eksempel er datoen 13. august 2009 733632 dager fra januar 1. AD. Deling av tallet med 7 gir 4, derav en torsdag.

Gauss algoritme

Carl Friedrich Gauss beskrev en metode for å beregne ukedagen for 1. januar i et gitt år i en håndskrevet lapp i en samling astronomiske tabeller. Han publiserte det aldri. Det ble endelig inkludert i hans samlede verk i 1927. Sammenlignet med Rata Die, hjelper resultatet med å forenkle tellingen av år.

Gauss metode gjaldt den gregorianske kalenderen. Han nummererte ukedagene fra 0 til 6 fra og med søndag. Han definerte følgende operasjon.

Innganger
År nummer en , måned nummer M , dag nummer D .
Produksjon
Årets dag.
Fremgangsmåte
  1. Bestem først ukedagen d 1 1. januar.
    • For en gregoriansk kalender er ukedagen . Alternativt kan du angi C = A \ 100 , Y = A  % 100 , og verdien er .
    • For en juliansk kalender er ukedagen eller .
  2. Nå bestemme måned messige forskyvning m ved hjelp av oppslagstabellen med M .
  3. Retur d = ( d 1 + m + D ) % 7 .
Tabell over månedskompensasjoner
Måneder Jan Feb Mar Apr Kan Juni Jul Aug Sep Okt Nov Des
Vanlige år 0 3 3 6 1 4 6 2 5 0 3 5
Skuddår 4 0 2 5 0 3 6 1 4 6

Prosedyren ovenfor kan kondenseres til et enkelt uttrykk for det gregorianske tilfellet:

Virket eksempel

For år nummer 2000, A - 1 = 1999 , Y - 1 = 99 og C = 19 , er ukedagen 1. januar

Hverdagene 30. april 1777 og 23. februar 1855 er

og

Forklaring og notater

Algoritmen for ukedagen 1. januar kan bevises ved hjelp av modulo-aritmetikk. Hovedpoenget er at fordi 365 mod 7 = 1 , hvert år legger til 1 dag til progresjonen. Resten er justering for skuddår. De århundrebaserte versjonene har 36525 mod 7 = 6 .

Tabellen over måneders forskyvninger viser en avvik i februar på grunn av skuddåret. En vanlig teknikk (senere brukt av Zeller) er å flytte måneden til å begynne med mars, slik at sprangdagen er i halen på tellingen. I tillegg, som senere vist av Zeller, kan bordet erstattes med et aritmetisk uttrykk.

Denne formelen ble også omgjort til grafiske og tabellformede metoder for å beregne hvilken som helst ukedag av Kraitchik og Schwerdtfeger.

Ulik variasjon

Følgende formel er et eksempel på en versjon uten oppslagstabell og med en transponert måned. Formelen er

hvor

  • Y er året minus 1 for januar eller februar, og året for en annen måned
  • y er de to siste sifrene i Y
  • c er de to første sifrene i Y
  • d er dagen i måneden (1 til 31)
  • m er den skiftede måneden (mars = 1,…, februar = 12)
  • w er ukedagen (0 = søndag, ..., 6 = lørdag). Hvis w er negativ, må du legge til 7.
Tabell over månedskompensasjoner ( )
Måneder Jan Feb Mar Apr Kan Juni juli Aug Sep Okt Nov Des
Offset 0 3 2 5 0 3 5 1 4 6 2 4

Zellers algoritme

I Zellers algoritme er månedene nummerert fra 3 for mars til 14 for februar. Året antas å begynne i mars; dette betyr for eksempel at januar 1995 skal behandles som måned 13 i 1994. Formelen for den gregorianske kalenderen er

hvor

  • Y er året minus 1 for januar eller februar, og året for en annen måned
  • y er de to siste sifrene i Y
  • c er de to første sifrene i Y
  • d er dagen i måneden (1 til 31)
  • m er den skiftede måneden (mars = 3, ... januar = 13, februar = 14)
  • w er ukedagen (1 = søndag, .. 0 = lørdag)

Den eneste forskjellen er en mellom Zellers algoritme ( Z ) og den forskjellige Gauss -algoritmen ( G ), det vil si Z - G = 1 = søndag .

(Mars = 3 i Z, men mars = 1 i G )
Tabell over månedskompensasjoner ( )
Måneder Mar Apr Kan Juni Jul Aug Sep Okt Nov Des Jan Feb
Offset 1 4 3 6 1 4 6 2 5 0 3 5

Wangs algoritme

Wangs algoritme for menneskelig beregning av den gregorianske kalenderen er (formelen skal trekkes med 1 hvis m er 1 eller 2 hvis året er et skuddår)

hvor

  • er årets siste siffer
  • er årets siste andre siffer
  • er årets to første sifre
  • er dagen i måneden (1 til 31)
  • er måneden (januar = 1,…, desember = 12)
  • er ukedagen (0 = søndag, ..., 6 = lørdag)
  • er null-dagers-funksjonen (månedsforskyvning) med verdier oppført i tabellen nedenfor
m
1 1 En dag
3 5 m + 2
5 7
7 9
9 3 m + 1
11 12
2 12 m + 3
4 2 m - 2
6 4
8 6
10 8
12 10

En algoritme for den julianske kalenderen kan utledes fra algoritmen ovenfor

hvor er en dommedag.

m
1 3 C -dag
3 7 m + 4
5 9
7 11
9 5 m - 4
11 7
2 0 m - 2
4 4 m
6 6
8 8
10 10
12 12

Andre algoritmer

Schwerdtfegers metode

I en delvis tabellmetode av Schwerdtfeger er året delt inn i århundret og det tosifrede året i løpet av århundret. Tilnærmingen avhenger av måneden. For m ≥ 3 ,

g er mellom 0 og 99. For m = 1,2 ,

Formelen for ukedagen er

der den positive modulen er valgt.

Verdien av e er hentet fra følgende tabell:

m 1 2 3 4 5 6 7 8 9 10 11 12
e 0 3 2 5 0 3 5 1 4 6 2 4

Verdien av f er hentet fra tabellen nedenfor, som avhenger av kalenderen. For den gregorianske kalenderen,

c mod 4 0 1 2 3
f 0 5 3 1

For den julianske kalenderen,

c mod 7 0 1 2 3 4 5 6
f 5 4 3 2 1 0 6

Lewis Carrolls metode

Charles Lutwidge Dodgson ( Lewis Carroll ) utviklet en metode som lignet et puslespill, men delvis tabellformet i å bruke de samme indeksnummerene for månedene som i "Komplett tabell: julianske og gregorianske kalendere" ovenfor. Han lister opp de samme tre justeringene for de tre første månedene av sprangår, en 7 høyere for de siste, og gir kryptiske instruksjoner for å finne resten; hans justeringer i århundrer skal bestemmes ved hjelp av formler som ligner dem for århundres tabellen. Selv om det er eksplisitt å påstå at metoden hans også fungerer for Old Style -datoer, ble eksemplet hans gjengitt nedenfor for å fastslå at "1676, 23. februar" en onsdag bare fungerer på en juliansk kalender som starter året 1. januar, i stedet for 25. mars som den den "gamle stilen" julianske kalenderen .

Algoritme:

Ta den oppgitte datoen i 4 porsjoner, dvs. antall århundrer, antall år over, måneden, dagen i måneden.

Beregn de følgende 4 elementene, og legg hver, når den er funnet, til summen av de forrige elementene. Når en vare eller sum overstiger 7, deler du med 7 og beholder bare resten.

Århundreelement: For ' Old Style ' (som endte 2. september 1752) trekker du fra 18. For ' New Style ' (som begynte 14. september 1752) dividerer du med 4, tar overskudd fra 3, multipliserer resten med 2.

Årspost: Legg sammen antall titalls, overskudd og antall 4s i overskudd.

Månedspost: Hvis det begynner eller slutter med en vokal, trekker du tallet og angir stedet i året fra 10. Dette, pluss antall dager, gir elementet for den påfølgende måneden. Varen for januar er "0"; for februar eller mars, "3"; for desember, "12".

Dagelement: Totalen som er nådd, må korrigeres ved å trekke fra "1" (først legge til 7, hvis totalen er "0"), hvis datoen er januar eller februar i et skuddår, og husk at hvert år, delelig med 4, er et skuddår, unntatt bare århundreårene, i `` Ny stil '', når antall århundrer ikke er så delbart (f.eks. 1800).

Det endelige resultatet gir ukedagen, "0" som betyr søndag, "1" mandag, og så videre.

Eksempler:

1783, 18. september

17, delt på 4, blader "1" over; 1 fra 3 gir "2"; to ganger 2 er "4". 83 er 6 dusin og 11, og gir 17; pluss 2 gir 19, dvs. (dividere med 7) "5". Totalt 9, dvs. "2" Varen for august er "8 fra 10", dvs. "2"; så, for september er det "2 pluss 31", dvs. "5" Totalt 7, det vil si "0", som går ut. 18 gir "4". Svar: "Torsdag".

1676, 23. februar

16 fra 18 gir "2" 76 er 6 dusin og 4, og gir 10; pluss 1 gir 11, dvs. "4". Totalt "6" Varen for februar er "3". Totalt 9, dvs. "2" 23 gir "2". Total "4" korreksjon for skuddår gir "3". Svar: "Onsdag".

Siden 23. februar 1676 (regnet februar som den andre måneden) er, for Carroll, samme dag som gregoriansk 4. mars 1676, unnlater han å komme frem til det riktige svaret, nemlig "fredag", for en dato i gammel stil som på den gregorianske kalenderen er samme dag som 5. mars 1677. Hadde han riktig antatt året som skulle begynne den 25. mars , hadde metoden hans stått for forskjellige årstall - akkurat som George Washingtons fødselsdag er forskjellig - mellom de to kalenderne.

Det er bemerkelsesverdig at de som har publisert Carrolls metode på nytt har unnlatt å påpeke feilen hans, særlig Martin Gardner .

I 1752 forlot det britiske imperiet bruken av den gamle juliansk kalenderen etter å ha vedtatt den gregorianske kalenderen , som har blitt dagens standard i de fleste land i verden. For mer bakgrunn, se Old Style og New Style dates .

Metoder i datakode

Keith

I C-språk uttrykkene nedenfor y, mog der henholdsvis heltallsvariabler representerer året (for eksempel 1988), måned (1-12) og dag i måneden (1-31).

(d+=m < 3 ? y-- : y-2, 23*m/9+d+4+y/4-y/100+y/400)%7

I 1990 publiserte Michael Keith og Tom Craver det foregående uttrykket som søker å minimere antall tastetrykk som trengs for å gå inn i en selvstendig funksjon for å konvertere en gregoriansk dato til en numerisk ukedag. Det returnerer 0= søndag, 1= mandag, etc. Dette uttrykket ligner strukturelt på Zellers algoritme, men har en unik månedskomponent.

Like etter strømlinjeformet Hans Lachman algoritmen for enkel bruk på avanserte enheter. Som opprinnelig designet for fire-funksjonskalkulatorer, trenger metoden hans færre tastaturoppføringer ved å begrense rekkevidden til enten 1905–2099 e.Kr., eller til historiske julianske datoer. Den ble senere endret for å konvertere en gregoriansk dato, selv på en abacus . På Motorola 68000 -baserte enheter er det på samme måte mindre behov for enten prosessorregistre eller opkoder , avhengig av det tiltenkte designmålet.

Sakamotos metoder

Tabellenes forløper til Tønderings algoritme er nedfelt i følgende K & R C -funksjon. Med mindre endringer ble den tilpasset andre programmeringsspråk på høyt nivå, for eksempel APL2 . Skrevet av Tomohiko Sakamoto på comp.lang.c Usenet -nyhetsgruppen i 1992, den er korrekt for enhver gregoriansk dato.

dayofweek(y, m, d)	/* 1 <= m <= 12,  y > 1752 (in the U.K.) */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    if ( m < 3 )
    {
        y -= 1;
    }
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

Den returnerer 0= søndag, 1= mandag, etc.

Sakamoto la også ut en mer skjult versjon samtidig:

dow(m,d,y) { y-=m<3; return(y+y/4-y/100+y/400+"-bed=pen+mad."[m]+d)%7; }

Denne versjonen koder for månedens forskyvninger i strengen, og som et resultat krever en datamaskin som bruker standard ASCII for å kjøre algoritmen riktig, noe som reduserer portabiliteten . I tillegg omfatter begge algoritmer utelate int typen erklæringer , som er tillatt i den opprinnelige K & R C, men ikke tillatt i ANSI C .

(Tønderings algoritme er igjen lik strukturen til Zellers kongruens og Keiths korte kode, bortsett fra at den månedsrelaterte komponenten er 31*m/12. Sakamotos er et sted mellom Disparate Gaussian og Schwerdtfegers algoritme, tilsynelatende uvitende om uttrykksformen.)

Se også

Referanser

  • Hale-Evans, Ron (2006). "Hack #43: Beregn hvilken som helst ukedag". Mind performance hacks (1. utg.). Beijing: O'Reilly. s.  164–169 . ISBN 9780596101534.
  • Thioux, Marc; Stark, David E .; Klaiman, Cheryl; Schultz, Robert T. (2006). "Ukens dag da du ble født i 700 ms: Kalenderberegning i en autistisk savant". Journal of Experimental Psychology: Human Perception and Performance . 32 (5): 1155–1168. doi : 10.1037/0096-1523.32.5.1155 .
  • Treffert, Darold A. "Hvorfor kalenderberegning?". Islands of genius: det autistiske, ervervede og plutselige savants rikelige sinn (1. publ., [Repr.]. Red.). London: Jessica Kingsley. s. 63–66. ISBN 9781849058735.

Eksterne linker