Hey allemaal, ik heb een script om de datum van de week, begin en eind datum te halen met het weeknummer. Alleen nu is het nieuwe jaar begonnen en is alles 1 dag opgeschoven. Kan iemand mij helpen ik zie de fout niet.

Het script:
<?
function DatumVanWeek($iWeek, $iYear)
{
// Get a random monday in the requested year
$iMonday = mktime(0, 0, 0, 3, 1, $iYear);
$iMonday = mktime(0, 0, 0, 3, 1-(date('w', $iMonday)-1), $iYear);
// Get the date of week 1
$iFirstWeek = mktime(0, 0, 0, 3, -7*(date('W', $iMonday)-1), $iYear);

$date = mktime(0, 0, 0, date('m', $iFirstWeek), date('d', $iFirstWeek) + 7*($iWeek-1), date('Y', $iFirstWeek));

$dag = date("d", $date) + 6;
$laatste = mktime(0,0,0,date("m", $date),$dag,date('Y'));

echo tijden($date, 'wedstrijden') . " - " . tijden($laatste, 'wedstrijden');
}
?>
Grinnnnn zo leuk dat je dan zelf weer achter een foutje komt!! Echt heel mooi gedaan en voor beide CHAPEAU.
Hoi Lissy,

ja, ik doe:
$timestamp_week = strtotime ('+' . $weeknr . ' week', $timestamp_1jan);

Dus hij telt er altijd 1 week bij op, maar als 1 januari op een maandag valt is dat niet nodig.
Zo is ie beter:

<?php
function dates_from_weeknr ($weeknr, $year, $format = '%d-%m-%Y') {
if ($weeknr < 0 || $weeknr > 53) return false;
$ts_1jan = strtotime ('1 january ' . $year);
$ts_week = strtotime ('+' . $weeknr . ' week', $ts_1jan);
$weekdag = strftime ('%u', $ts_week);
if ($weekdag == '1') {
$ts_week -= (24*3600*7);
}
$dagen_tot_begin_week = $weekdag - 1;
$dagen_tot_eind_week = 7 - $weekdag;
$begindatum = strtotime ("-" . $dagen_tot_begin_week . " days", $ts_week);
$einddatum = strtotime ("+" . $dagen_tot_eind_week . " days", $ts_week);
return array (strftime ($format, $begindatum), strftime ($format, $einddatum));
}
?>
@Jan: Lekker korte code. Maar helaas, hij heeft dezelfde fout als die ik 2 posts geleden heb gemeld.
@ SanThe: ik heb even gekeken, maar 1 januari 2002 valt op een dinsdag. Ik ga er in mijn code vanuit dat de week met maandag begint en dat weeknummer 1 de eerste hele week is.

Bijvoorbeeld 2001 ligt 1 januari op een maandag. Die heb ik net getest, en dit gaat goed:

<?php
function dates_from_weeknr ($weeknr, $year, $format = '%d-%m-%Y') {
if ($weeknr < 0 || $weeknr > 53) return false;
$timestamp_1jan = strtotime ('1 january ' . $year);
$timestamp_week = strtotime ('+' . $weeknr . ' week', $timestamp_1jan);
$weekdag = strftime ('%u', $timestamp_week);
if ($weekdag == '1') $timestamp_week -= (7 * 24 * 3600);
$dagen_tot_begin_week = $weekdag - 1;
$dagen_tot_eind_week = 7 - $weekdag;
$begindatum = strtotime ("-" . $dagen_tot_begin_week . " days", $timestamp_week);
$einddatum = strtotime ("+" . $dagen_tot_eind_week . " days", $timestamp_week);
return array (strftime ($format, $begindatum), strftime ($format, $einddatum));
}

echo '<pre>';
print_r (dates_from_weeknr (1, 2006, '%d-%m'));
print_r (dates_from_weeknr (1, 2006));
print_r (dates_from_weeknr (1, 2001));
echo '</pre>';
?>
Volgens ISO8601 is week1 de week waarin de eerste donderdag zit.
Dankje wel Willem, hahaha! Nu zitten we dus met vijf mogelijkheden:

Week 1 is de eerste volledige week die op ma begint
Week 1 is de eerste volledige week die op zo begint
Week 1 is de week waarin 1 jan voorkomt, begint op ma
Week 1 is de week waarin 1 jan voorkomt, begint op zo
Week 1 is de week met de eerste donderdag

Ik zal ff mijn functie aanpassen (NOT!)

LOL
Willem vp schreef op 09.01.2006 12:03
Volgens ISO8601 is week1 de week waarin de eerste donderdag zit.


Dit zal dan wel de oplossing zijn voor het grote puzzelstuk.
Het bloed kruipt toch waar het niet gaan kan:

<?php
// retourneert een array met de maandag en de zondag
// van een gegeven week en jaar volgens het ISO formaat
function ISOdates_from_weeknr ($weeknr, $year, $format = '%d-%m-%Y') {
$start = strtotime ('1 january ' . $year);
$week1 = strftime ('%V', $start);
$weeknr--;
while ($week1 != '01') {
$start += (7 * 24 * 3600);
$week1 = strftime ('%V', $start);
}
$timestamp_week = strtotime ('+' . $weeknr . ' week', $start);
$weekdag = strftime ('%u', $timestamp_week);
$dagen_tot_begin_week = $weekdag - 1;
$dagen_tot_eind_week = 7 - $weekdag;
$begindatum = strtotime ("-" . $dagen_tot_begin_week . " days", $timestamp_week);
$einddatum = strtotime ("+" . $dagen_tot_eind_week . " days", $timestamp_week);
$begindatum;
return array (strftime ($format, $begindatum), strftime ($format, $einddatum));
}
?>
Jan Koehoorn schreef op 09.01.2006 13:57
Het bloed kruipt toch waar het niet gaan kan:


Mooi, maar dat van mij dus ook.
Het script is een stuk verbeterd. Maar nog niet perfect. Als ik nu week 53 van 2002 opvraag, geeft jouw script 30-12-2002 en 05-01-2003 en mijn (nou ja) script geeft Het jaar 2002 heeft geen week 53. En dat klopt want wat jij geeft is week 1 van 2003.

Reageren