Omdat er bij Tata (voorheen Hoogovens/Corus) bij de ploegendiensten iets speciaals moet gebeuren met de al dan niet aanwezige 29 februari, had ik een stukje code met 28 februari en 1 maart erin.
Nu viel het mij (door een gemelde fout bij controle) op, dat als de weekdag op zondag valt, het weeknummer niet goed wordt bepaald maar een te laag is. Foutje in date(), of gedachtenkronkel van mij?
Hieronder de code, en daaronder enkele foute weken.
@Frank: die oplossing had ik ook al bedacht, het ging mij om wat er fout gaat, bij mij of in de functie.
Voor anderen: ook de "YW" geeft hetzelfde resultaat.
Als weekdag gelijk aan 0 is dan is het een zondag.
Als er 2 dagen verschil is dan is het een schrikkeljaar, je controleert tenslotte op 28 februari en 1 maart.
Om de 4 jaar is het een schrikkeljaar dus is er dan ook 2 dagen verschil.
Korte verklaring aan de hand van uw gegevens:
28 feb : 1425081661 6 201509. Zaterdag, 28 februari 2015
1 mrt : 1425168061 0 201509. Zondag, 1 maart 2015
28 feb : 1456617661 0 201608. Zondag, 28 februari 2016
1 mrt : 1456790461 2 201609. Dinsdag, 1 maart 2016 (Maandag, 29 februari 2016 = schrikkeljaar)
28 feb : 1582848061 5 202009. Vrijdag, 28 februari 2020
1 mrt : 1583020861 0 202009. Zondag, 1 maart 2020 (Ook hier is een schrikkeljaar, zaterdag 29 februari)
28 feb : 1614470461 0 202108. Zondag, 28 februari 2021
1 mrt : 1614556861 1 202109. Maandag, 1 maart 2021
Als je toch 1 tot 7 wilt waarbij 1=maandag en 7=zondag gebruik je N ipv w of if ($feb29Weekdag == 0){ $feb29Weekdag = 7; }
Maar zeker niet $feb29Weekdag++ want dan kan het gebeuren dat 28 februari en 1 maart allebei een maandag is (zoals in 2021)
Wellicht heb ik niet duidelijk genoeg aangegeven wat mijn "probleem" is. Het gaat mij erom dat 1 maart in deze gevallen in dezelfde week valt als 28 februari, maar met een eerder dagnummer, of dat 28 februari in een week eerder valt. Bij dag=0 lijkt mij dus het weeknummer fout.
Gaat het echt fout, of doe ik iets fout. De oplossing die al gegeven werd had ik ook al bedacht.
Blijkbaar begint een week in de ogen van Tata Steel op Zondag.
In de ogen van PHP begint een week echter op Maandag.
Ik ga niet zeggen wat goed of fout is maar ik weet wel dat date(w) in PHP een 0 teruggeeft voor zondag, een 1 voor maandag en zo door tot een 6 voor zaterdag. Ook zal het weeknummer pas opgehoogd worden op maandag. Dat is gewoon de 'wet' van PHP.
Met de nadruk op het woord 'lijkt'. ;-) Je vergelijkt namelijk een niet-ISO dagnummer ('w') met een ISO-weeknummer ('W'). Dat geeft merkwaardige resultaten. Zoals G P al zei: als je in plaats van met 'w' je dagnummer bepaalt met 'N' gaat het wel goed. Zondag wordt dan 7 i.p.v. 0.
OK, aan de hand van deze antwoorden zie ik waar mijn kronkel zit: ik schatte de dagnummers als echte algebraische volgorde in, en dat is dus niet zo. 1234560 is zoals php het ziet binnen een week.
Allen dank voor het meedenken, wat mij betreft gesloten.