Zeuhw, ik heb geen zin in hw en er is al veel te lang geen nieuwe blog geweest.
Deze blog gaat over het berekenen op welke dag een bepaalde datum valt.
Dit is altijd handig, en als je het uit je hoofd kan (ik kan t al voor elke datum in elk jaar, in de maanden januari tot juni :\')) heb je geen kalenders meer nodig :\')
Met wat oefening gaat vaak ook sneller dan dat je eerst ff op je mobiel of computer moet kijken.
Ik heb het uit het boek \"Mind Performance Hacks\", geschreven door Ron Hale-Evans, uitgegeven door O\'Reilly.
En natuurlijk ben ik niet zó stupid om een Engels boek te bestellen die ik maar 1 keer ga lezen, dus heb ik de e-book gedownload :\')
Als er vraag naar is zal ik m uploaden of de downloadlink posten. Kijk onderaan deze blog.
Dit is trouwens hack #43 uit hoofdstuk 4: Math uit het boek (gaat over mindhacks, niet over computerhacks).
Wat je vooraf moet weten.
De div operator.
Deze gebruiken we om de eerste variabele te berekenen. De div is hetzelde als het normale delen-door, alleen zonder de \'rest\'.
Bij bijvoorbeeld 8 div 3 wordt het antwoord dus 2, omdat 3 twee keer in 8 past. In php zou je het zo berekenen: $answer = floor(8 / 3);
Die rond het af naar beneden, waardoor het getal achter de komma (dat is dus de \'rest\') verdwijnt.
De modulo operator.
Deze schrijven we in onze berekeningen als getal mod getal (zo tik je het ook in je rekenmachine in).
Dit is precies het omgekeerde van de div. Deze haalt niet de \'rest\' weg, maar ís de \'rest\'.
Als we weer hetzelfde voorbeeld gebruiken, wordt 8 modulo 3 = 2. Dat omdat 3 twee keer in 8 past, en dan blijft er nog 2 over.
Naar mijn redenering (weet niet of het klopt, hebben we nog niet gehad met wiskunde :\')) wordt de modulo berekent door de restwaarde (getal achter de komma) vermenigvuldigt met het getal waar je door zou delen.
Als je dus 8 / 3 doet, komt daar 2,667 uit. Als je nu de 0,667 x het getal waar je door deelde (3) doet, kom je op 2.
Mmnouja, veel zullen hier niks van snappen, maar wees gerust, er zit een knopje \'mod\' op je Windows-rekenmachine :\')
Ohja, en dit noemen we ook wel \'cast out sevens\', oftewel, de zevens eruit halen. Dat is eigenlijk ook precies wat er gebeurd.
Let\'s begin.
De variabelen.
We hebben 5 variabelen nodig om de weekdag te berekenen:
1. het jaaronderdeel.
2. het maandonderdeel.
3. het dagonderdeel.
4. de jaarinstelling.
5. het schrikkeljaar.
Ik ga het hier ff wat korter benoemen, dus we gebruiken het op de php-manier: $year, $month, $day, $yAdjustment en $leap.
Het jaaronderdeel: $year.
Deze bereken je door de laatste 2 cijfers van het jaar in te vullen voor de YY in de volgende formule:
(YY + (YY div 4)) mod 7
Het maandonderdeel: $month.
Hier hoef je niks te berekenen, deze zoek je gewoon op in de volgende tabel:
2
3
4
5
6
7
8
9
10
11
12
13
Maand Key Januari 0 Februari 3 Maart 3 April 6 Mei 1 Juni 4 Juli 6 Augustus 2 September 5 Oktober 0 November 3 December 5
Het dagonderdeel: $day.
Deze is gewoon hetzelfde als de dag. Als je datum 22 maart 2005 heb gekozen is je $day dus 22.
De jaarinstelling: $yAdjustment.
Hier ligt nog wat meer achter dan ik hier ga vertellen, maar voor wat wij hier doet is het volgende goed genoeg. Achter de tijdspan staat de key, je $yAdjustment.
2
3
4
5
6
7
8
Tijdspan Key 1700-1799 4 1800-1899 2 1900-1999 0 2000-2099 6 2100-2199 4 2200-2299 2 2300-2399 0
Het schrikkeljaar: $leap.
We rekenen hier met data vanaf 1752 (heeft met de Juliaanse en de Gregoriaanse kalenders te maken, wordt te uitgebreidt om hier te vertellen).
De $leap wordt eigenlijk alleen maar een 1 of een 0. Als je datum in een januari of februari van een schrikkeljaar valt, wordt $leap 1.
Een jaar is een schrikkeljaar als het jaar deelbaar is door 4, behalve jaren die ook deelbaar zijn door 100. Behalve jaren die ook deelbaar zijn door 400, zijn wel schrikkeljaren.
Lekker ingewikkeld. Voorbeeldjes:
1936 was wél een schrikkeljaar (deelbaar door 4).
1937 was géén schrikkeljaar (níet deelbaar door 4).
1800 en 1900 waren géén schrikkeljaren (deelbaar door 100),
maar 2000 was het wél (ook deelbaar door 400).
Dus, schrikkeljaar? $leap = 1. Geen schrikkeljaar? $leap = 0.
De berekening.
Nu we de vijf variabelen hebben, gaan we de berekening maken.
Zoals ik al zei, gebruiken we voor de variabelen die we hebben berekend, de woorden $year, $month, $day en $yAdjustment.
We gaan het eerst met zogenaamde letter(variabele)berekeningen doen, en daarna met een voorbeeld.
We onthouden telkens één cijfer, die noemen we $c, waar de c staat voor current.
$c = $year = (YY + (YY div 4)) mod 7
$c = ($c + $month) mod 7
$c = ($c + $day) mod 7
$c = ($c + $yAdjustment - $leap) mod 7
En wat doen we nu met die uiteindelijke $c ? Dat is het nummer van de weekdag. Kijk hier maar eens:
2
3
4
5
6
7
8
Weekdag Resultaat Zondag 0 Maandag 1 Dinsdag 2 Woensdag 3 Donderdag 4 Vrijdag 5 Zaterdag 6
Is je $c dus 2? Dan valt je datum op een dinsdag
Het voorbeeld.
Nu een concreet voorbeeld.
We gaan de weekdag van 13 mei 2009 berekenen.
We beginnen bij het begin.
1. Het jaaronderdeel. (YY + (YY div 4)) = (9 + (9 div 4)) = (9 + (2)) = 11. 9 div 4 = 2 omdat 4 twee hele keren in 9 past.
Daar halen we de zevens uit: 11 mod 7 = 4 omdat we er 1 keer een zeven uit kunnen halen. Dan blijft er dus nog 4 over. Die onthouden we.
2. De Key voor mei is 1, dus ons maandonderdeel is 1. Dan doen we (4 + 1) mod 7 = 5 mod 7 = 5. Omdat we daar geen zeven uit kunnen halen blijft het gewoon 5.
3. De Key voor onze dag (13) is gewoon 13. Dus dan wordt (5 + 13) mod 7 = 18 mod 7 = 4. Omdat we 2 keer een zeven uit 18 kunnen halen, en dan blijft er nog 4 over.
4. De jaaraanpassing/jaarinstelling voor 2009 is 6, omdat het tussen 2000 en 2099 valt. Het is géén schrikkeljaar omdat het niet deelbaar is door 4.
Dus onze berekening wordt: (4 + 6 - 0) mod 7 = 10 mod 7 = 3
Ons resultaat is 3, dus de datum valt op woensdag!
En dat kunnen we in elke kloppende kalender nakijken, en dan zien we dat het klopt
Uit je hoofd.
Het is niet zo moeilijk uit je hoofd. Het enige wat je moet weten is de (YY + (YY div 4)) mod 7 formule, de jaaraanpassingen en de maandkey\'s.
Als je die kent hoef je alleen maar het jaaronderdeel + maandkey, dan het verkregen resultaat + de dag, daarna dát verkregen resultaat + de jaaraanpassing - of het een schrikkeljaar is, en tussen die handelingen telkens de zevens eruit halen.
Oefen het een paar keer en het is echt makkelijk, geloof me
References.
Als je nog wilt kijken of je datumberekening klopt, kan je altijd op mijn simpele kalendertje kijken: [url]http://www.iisysz.com/calendr.php[/url].
Op verzoek van Thaan en Florian:
Origineel artikel komt uit het volgende boek (pass staat in het commentaar van de rar).
(sry voor de [code] tags, maar anders werd de link gefuckt door het _O_ gedeelte :\'))
http://rapidshare.de/files/20285083/Mind_Performance_Hacks_Tips_and_Tools_for_Overclocking_Your_Brain_-_O_Reilly.rar.html
Wat je in de rar zal vinden is een .chm bestand (een Windows helpbestand) met daar het hele boek in, verdeeld in hoofdstukken. Volgens mij alleen te openen in Windows Sorry Twy :\')
Hoop dat jullie er wat van onthouden hebben :\')
Well, have fun and spread the word Or weekday