Nog meer kalenders.

Bent u al geschrokken dit jaar? ;-).


Beste mensen,

Kalenders maken kan prima met het programma JaarKal/bas uit 1984!, zoals verspreid met de *Asterisk nummer 30-01 van januari 2012, maar hier kan nog iets is in verbeterd worden:
Nu staat er op regel 575 *SPOOL RAM:$.2012
wat als gevolg heeft dat welk jaar je ook kiest, er altijd een bestand 2012 op de RAMdisc wordt aangemaakt c.q. overschreven. Met:
575 OSCLI"*SPOOL RAM:$."+STR$(j)
Krijgt het bestand als naam het betreffende jaartal, veel logischer derhalve. Het BBCBasic commando STR$(variabele) converteert een getal naar een $tring (=touwtje?) En met OSCLI kun je een *commando met $trings laten uitvoeren.

Ook wil ik nog een voorziening maken om de weeknummers automatisch te genereren conform de ISO 8601 en NEN 2772, maar dat vergt iets meer puzzelwerk, met name vanwegde de gebroken weken die in 2 maanden vallen, en ook vanwege het juist toepassen van het weeknummer waarin 1 januari valt, namelijk week 52, soms week 53 of week 1.
Maandag, dindsdag, woensdag of donderdag 1 januari vallen altijd in week 1.
Vrijdag 1 januari valt altijd in week 53 van het vorige jaar.
Zaterdag 1 januari valt in week 52 van het vorige (niet schrikkel) jaar.
Zaterdag 1 januari valt in week 53 van het vorige (wel schrikkel) jaar.
Zondag 1 januari valt altijd in week 52.
Andere vuistregels om mee te controleren:
4 januari valt altijd in week 1,
1 februari valt altijd in week 5,
28 december valt altijd in de laatste week (52 of 53) van het jaar.

In een rekenblad van !Resultz hebben Gerard van Katijk en ik dat al voor elkaar.
Voor het vaststellen of zaterdag 1 januari in week 52 of week 53 valt, is het noodzakelijk om te bepalen of het *vorige* jaar een schrikkeljaar was of niet en dat komt slechts 1 x per 28 jaar terug.
De formule daarvoor in !Resultz is behoorlijk ingewikkeld:

if((b1-1>1582)&(mod(b1-1,400)=0|(mod(b1-1,4)=0&mod(b1-1,100)<>0))|((b1-1<1583)&(mod(b1-1,4)=0)),29,28)

Cel b1 is het gevraagde jaar, b1-1 is dan het vorige jaar
| = OR, en & = AND, MOD = Modulo = rest na een deling.

Voor 1582 goldt de Juliaanse kalender en die had meer schrikkeljaren, namelijk om de 4 jaar dus ook alle eeuwtallen, maar dat bleek een te grote correctie ten opzichte van de aardrotatie in de natuur (zonnetijd).
Gregorius heeft dat fijner afgesteld door minder schrikkeljaren toe te passen. Na 1582 hebben alleen eeuwjaren die deelbaar zijn door 400 nog een schrikkeldag.
Dus 1600 wel, 2000 ook, maar 1700, 1800, 1900 en 2100 niet meer.
Met het commando MOD geeft als antwoord de rest van een deling.

Indien 1 januari op zaterdag begint, moet dus worden vastgesteld of het vorige jaar een schrikkeljaar was.
Daarvoor kon ik dezelfde formule gebruiken, maar dan i.p.v. jaar, jaar-1.
Als dat 29 oplevert (=schrikkeljaar), dan valt 1 januari in week 53, en indien 28 (geen schrikkeljaar), dan in week 52.
De niet schrikkeljaren 1921 1949 1977 2005 2033 2061 2089 beginnen met week 53, om de 28 jaar dus.

Vaak wordt ten onrechte aan de laatste week van het vorige jaar het weeknummer 52 toegekend, terwijl dat 53 had moeten zijn.
Nogal wat (commercieel gedrukte) kalenders beginnen dus fout!
Ook week 1 wordt nog wel eens fout gekozen, maar die is simpeler te bepalen.
1 januari valt altijd in het weeknummer waarin de meeste dagen (4 of meer) van dat betreffende jaar vallen. Bij 3 of minder valt die week dus in het andere jaar.

In welke week valt 1 januari?


Er zijn eigenlijk maar 15 verschillende soorten kalenders.
8 voor gewone jaren, en 7 voor schrikkeljaren,
doch in een enkel geval komt er na week 52 een week 53.
Soms begint zaterdag 1 januari in week 52 en soms in week 53, terwijl de rest van de kalender wel hetzelfde is, bijvoorbeeld in het geval van zaterdag 1 januari is het van belang of het voorgaande jaar een schrikkel jaar was, vandaar 8 i.p.v. 7 verschillende kalender versies.
Er onstaat daarmee een cyclus die zich om de 28 jaren (7 schrikkeljaren en 3 x 7 = 21 gewone jaren) herhaalt tussen 1901 en 2099.
Immers bij een eeuwjaar wat geen schrikkeljaar is zoals b.v. (1900 en 2100), verandert de cyclus omdat er een dag minder beschikbaar is (geen 29e feb.).

Intussen is het me gelukt om alle 15 kalenders voor de 199 jaren tussen 1901 en 2099 op een rij te zetten. Was even puzzelen in een !Eureka sheet. Zie de bijlage 15jaarA3.pdf voor het resultaat
Als je die alle 15 uitprint, ben je de rest van je leven voorzien ;-).

Zie ook NEN 2771:
http://nl.wikipedia.org/wiki/NEN_2772

Week 53:
http://www.utwente.nl/so/roosterwerkgroep/vaak_gestelde_vragen/53_weken.doc

Zo, wie kalenders en/of agenda's wil maken, heeft nu voldoende voer om te puzzelen en te programmeren ;-).

Het RISC OS programma !Organiser doet het gelukkig zoals het hoort in de agenda. In de kalender zijn de weeknummers helaas weggelaten.

Wil je snel weten of een jaar een schrikkeljaar is, dan kun je het programmaatje !LeapYear gebruiken.
Wie al wat ontdooid is van deze koude winter, kan makkelijk bekijken wat de Paasdatum zal worden in een gegeven jaar met behulp van het programma !Easter van dezelfde auteur. Veel plezier ermee.
Straks weer gezellig Paaseieren zoeken, ja die Eastereggs zitten zelfs in Acorn conputers, echt waar. Fred, Jim en Sheila weten er in ieder geval al van. Daarover een volgende keer meer.


Met een vriendelijke groet van Henri Derksen.


Bijlage(n):
Schrikkel.zip met daarin !LeapYear, (6.353 Bytes),
PaasDatum.zip met daarin !Easter. (20.569 Bytes).
15jaarA3.pdf (25.440 Bytes).