misschien nog even duidelijker..
heb datum woensdag bvb 2011/08/17het is week 33 - dag 3
en ik zou in mijn database willen
maandag 2011/08/15
dinsdag 2011/08/16
... enz tot aan
vrijdag 2011/08/16
[quasi offtopic]
Ik hoop dat dit ("14/08/2011") niet het formaat is waarmee je datums in de database opslaat. Dit is een string die een datum bevat zoals je deze zou afdrukken. Dit is om meerdere redenen onpraktisch:
- nu is de huisstijl op je site toevallig dd/mm/yyyy, maar wat als deze verandert, moet je dan al je database-entries aanpassen?
- in deze vorm is het heel moeilijk om door deze datums te zoeken, stel dat je alle items uit een bepaald tijdsinterval wilt hebben, dan wordt het heel pijnlijk met zo'n ddmmyyyy stramien omdat deze niet echt een sortering volgt...
Los van het feit of dit in een database staat of niet, het is verdraaid lastig om hiermee te rekenen / datums te berekenen. Wat ik zou doen is ofwel UNIX-timestamps gebruiken, of het date-formaat (yyyy-mm-dd) of de DateTime Class. In ieder geval: een of andere standaard en niet een custom formaat.
[/quasi offtopic]
Ontopic: Is de datum die je krijgt altijd de maandag? Of een willekeurige dag uit die week? Stel dat de datum die je krijgt een zaterdag of een zondag is, is dit mogelijk? Zoja, welke week wil je dat er geretourneerd wordt?
Ik denk dat als deze vragen beantwoord zijn (dus als de specificatie wat beter is) je een heel eind zult komen met de functies date() en mktime() in combinatie met wat simpel rekenwerk.
@FangorN, zeker geen timestamps, dat is eigenlijk even verkeerd. MySQL heeft zo'n mooie functies aan boord betreffende datums. Een tutorial die dit goed uitlegt is de volgende: http://phptuts.nl/view/1/
Timestamps verkeerd? Wut? Waar haal je die wijsheid vandaan? MySQL heeft inderdaad een arsenaal aan datum/tijd functies, maar ik had de indruk dat HannaH in PHP datums wilde berekenen. Het lijkt me vreemd om daarvoor queries te gaan uitvoeren?
Als je applicaties "voor de eeuwigheid" schrijft, heb je over een jaar of 20 of daaromtrent problemen als je timestamps gebruikt, akkoord, maar voor nu lijkt mij dit prima geoorloofd. Netter zou wellicht het rekenen met de datetime klasse zijn maar ik heb geen idee of dit makkelijk(er) rekent dan gewone timestamps.
Doorgaans wil men eerst iets werkends, daarna kan over een elegantere / efficiëntere oplossing nagedacht worden .
Overigens heb ik reeds lange tijd (10 jaar?) prima met UNIX timestamps uit de voeten gekund. Misschien is het esthetisch minder verantwoord, maar esthetiek is meestal heel snel ondergeschikt aan pragmatisch gebruik.
Ik denk dat deze topic helemaal de focus verloren heeft.
het gaat erover dat ik de datums in m'n database wil stopen van de week waar ik 1 dag van geselecteerd krijg. en niet het formaat
Ik 'pick' de datum en krijg in het juiste database formaat bvb '2011-08-15'
de datum waar maandag 1 is en ik de weekends niet kan 'picken'
ik wil op basis van die éne datum de hele week in de database stoppen
dus als ik maandag pick -> di, woe , do, vrij
als ik woensdag pick -> ma, di, do, vr
vrijdag -> ma, di, woe, do ...
ik kan dit allemaal opvragen en if-en maar ik vroeg me af of er geen
simpel en mooi stukje code bestaat?
Thomas - 15/08/2011 12:32 (laatste wijziging 15/08/2011 12:34)
<?php
/*
* input: een weekdag (ma-vr) met datumformaat yyyy-mm-dd
* output: een array met alle dagen van die week als unix timestamp (formaat kun je zelf regelen via date())
*/
function currentWeek($date)
{
list($y, $m, $d) = explode('-', $date);
$unixDate = mktime(0, 0, 0, $m, $d, $y);
$weekDay = date('N', $unixDate);
// hier mogelijk extra controle of $weekDay tussen 1 (maandag) en 5 (vrijdag) ligt
$weekDates = array();
for ($i=1; $i < 6; $i++) {
$weekDates[] = mktime(0, 0, 0, $m, $d - $weekDay + $i, $y);
}
return $weekDates;
} // function currentWeek
// test vandaag
foreach (currentWeek('2011-08-15') as $day) {
echo date('D j F Y', $day).'<br />';
}
// test maandoverschrijdend
foreach (currentWeek('2011-06-01') as $day) {
echo date('D j F Y', $day).'<br />';
}
// test jaaroverschrijdend
foreach (currentWeek('2009-01-01') as $day) {
echo date('D j F Y', $day).'<br />';
}
?>
<?php
/*
* input: een weekdag (ma-vr) met datumformaat yyyy-mm-dd
* output: een array met alle dagen van die week als unix timestamp (formaat kun je zelf regelen via date())