Het weeknummer berekenen
Op deze bladzijde wordt een function besproken die het weeknummer berekent uit een datum. De JavaScript code kun je downloaden om zelf te gebruiken.- Er worden twee items besproken:
- Gebruiken in je eigen website
- Het algoritme voor de berekening van het weeknummer
- De function WeekNr(vandaag) berekent het weeknummer. De parameter heeft de volgende betekenis:
- vandaag. Dit is een datum variabele. Van deze datum wordt het weeknummer berekend.
- De functie WeekNr() is algemeen geldig. Je kunt van elke datum het weeknummer laten berekenen door die datum in vandaag te zetten en die aan WeekNr() mee te geven.
- Als je wilt berekenen in welke week 'vandaag' valt gebruik je:
var vandaag = new Date()
- Als je bijvoorbeeld wilt berekenen in welke week 30 oktober 2006 valt gebruik je:
var vandaag = new Date("October 30, 2006")
- Opmerking: Voor het weergeven van de dag en de datum zijn de functies ToonDag()
en ToonDatum() gebruikt. Deze staan in de file dagdatum.js en worden besproken in het item:
"Systeem-datum tonen op een web-pagina".
De file dagdatum.js staat in de downloadfile op deze bladzijde.
- Het script werkt -zonder in detail te treden- ongeveer als volgt:
- Allereerst worden de volgende gegevens uit vandaag gehaald: Volledig jaartal, maand, datum en dag.
- Het aantal dagen dat is verstreken sinds Nieuwjaarsdag wordt berekend. Daarbij wordt ook gelet op schrikkeljaren, met behulp van de function schrikkel(jaar).
- Bij het aantal verstreken dagen wordt 10 opgeteld. Daarna wordt het dagnummer eraf getrokken (1=maandag, 2=dinsdag, enz, 7=zondag).
- Dit aantal, gedeeld door 7 en naar beneden afgerond, is het weeknummer.
- Als het weeknummer gelijk is aan nul wordt de laatste week van het vorige jaar bedoeld. In dat geval wordt het huidige
jaartal met één verlaagd, waarna WeekNr() zichzelf aanroept, zodat een nieuw weeknummer wordt
berekend.
Berekening van een nieuw weeknummer kan alleen voorkomen als 1, 2 of 3 januari bij de laatste week van het vorige jaar wordt gerekend. In dit geval zijn er drie uitkomsten mogelijk: 52, 53 en 0. Als er weer nul uitkomt probeert WeekNr() het nog een keer.
Door de aard van dit probleem kan WeekNr() zichzelf maximaal 2 maal aanroepen. De mogelijkheid van een oneindige recursieve loop is dus uitgesloten.
- Als het weeknummer gelijk is aan 53 kan het zijn dat week 1 van het volgende jaar wordt bedoeld.
In dat geval is een correctie nodig:
- 29 december op maandag valt, of als:
- 30 december op maandag of dinsdag valt, of als:
- 31 december op maandag, dinsdag of woensdag valt.
Als je hier nog wat mee wilt spelen dan kan dat. Klik op de knop hier naast. |
|
Een uitgewerkte toepassing vind je in het item "Maandkalender II: met weeknummers" |
Informatie over de berekening van het weeknummer
ISO 8601 is de Internationale Norm, vastgesteld door de International Organization for Standardization,
die onder andere de nummering van de weken beschrijft.
De Norm stelt dat de week begint op een maandag. Dit is dus de eerste dag van de week. Daardoor is de
zondag de laatste dag van de week, dag nummer 7. Dit wijkt af van het gangbare idee (die in de meeste
maandkalenders en programmeertalen wordt gebruikt (waaronder JavaScript), dat de eerste dag van de week
de zondag is. Men heeft echter gekozen voor de maandag als eerste dag, omdat het tegelijk de eerste werkdag
van de week is. Moderne weekagenda's beginnen hun week ook met de maandag.
Weeknummering wordt ook beschreven in de Nederlanse Norm NEN 2772. Deze is geheel in lijn met ISO 8601.
Omdat de week 7 dagen heeft, is de eerste week van het jaar de week die 4 (is afgerond de helft van 7) of meer dagen in dat jaar heeft.
Valt 1 januari op een maandag, dan heeft die week 7 dagen in het nieuwe jaar en is het daarom week 1.
Valt 1 januari op een woensdag, dan heeft die week 2 dagen in het oude en 5 in het nieuwe jaar. Ook deze week is week nummer 1.
Valt 1 januari op een zaterdag, dan heeft die week 5 dagen in het oude en 2 in het nieuwe jaar. Deze week behoort dus nog tot het oude jaar. De eerste week begint dan op 3 januari.
Het is eenvoudig om te zien welke week de eerste van het jaar is. Kijk naar de eerste donderdag van het nieuwe jaar, de vierde dag van de week immers en dus op de helft. Deze week is nummer 1.
Bron: Wikipedia, met aanpassingen/toevoegingen.
Gebruik:
- De code staat gedeeltelijk in de <HEAD> en gedeeltelijk in de <BODY>.
De code ziet er als volgt uit:
(Zet dit in de <HEAD>).
(Zet dit in de <BODY>, op de plaats waar je het nodig hebt).<script src="dagdatum.js"></script>
<script>
// Weeknummer berekening volgens ISO 8601
function schrikkel(jaar){
if(((jaar % 4 ==0) && (jaar % 100 != 0)) || (jaar % 400 == 0)) return 1; // wel schrikkeljaar
else return 0; // geen schrikkeljaar
}
function WeekNr(vandaag) {
var verstrekenMaanden =
new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var dagInMaand = vandaag.getDate();
var dagno = vandaag.getDay(); if (dagno == 0) dagno = 7;
var maandno = vandaag.getMonth();
var jaarno = vandaag.getFullYear();
var verstrekenDagen = 0;
for(var i=0; i<maandno; i++) verstrekenDagen += verstrekenMaanden[i];
if (maandno > 1 && schrikkel(jaarno) == 1) verstrekenDagen++;
var nummer = Math.floor((verstrekenDagen+dagInMaand-dagno+10) / 7);
if (nummer == 0) {
var myDate = new Date(jaarno-1,11,31);
nummer = WeekNr(myDate);
}
if (nummer == 53) {
var H_date = vandaag.getDate(), H_day = vandaag.getDay();
if (H_date == 29 && H_day == 1) nummer = 1;
else if (H_date == 30 && H_day <= 2 && H_day !=0) nummer = 1;
else if (H_date == 31 && H_day <= 3 && H_day !=0) nummer = 1;
}
return nummer;
}
</script>
<script>
var nu = new Date();
document.write('Het is vandaag: <b>',ToonDag(nu),', ',ToonDatum(nu),'</b>. Deze dag valt in week: <b>',WeekNr(nu),'</b>.');
</script>
Downloaden:
Druk op de knop:
File: voorb188.zip, 1356 bytes.