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');
}
?>
Je wilt van een week zien welke data daarin zitten?
Dus week 1 : 2-8 jan
week 2 : 9-15 jan
Zoiets?
Ja, sorry dat ik dat niet duidelijk heb vermeld. Maar dat bedoel ik ja :)
Ik vind het een beetje een schimmige manier om de datum van de eerste maandag uit te rekenen... Zo uit mijn hoofd zou ik zeggen:

<?
# Eerste dag van het jaar
$firstDay = date('w',mktime(0,0,0,1,1,$iYear));

# Voor de berekening moet zondag dag 7 zijn. Als je
# PHP 5.1.0 hebt, kun je ook date('N',$tmp) doen,
# dan is de volgende regel niet nodig.
if ($firstDay == 0) { $firstDay = 7; }

# Vind nu de 1e maandag van het jaar
$iFirstWeek = mktime(0,0,0,1,1 + ((8-$firstDay)%7),$year);
?>

En nu kun je verder met je $date = ...
Hey, ziet er goed uit alleen hoe kan ik het dan als ik een week nummer heb bijvoorbeeld van week 3 de datum's ophalen?
Kwestie van code bij elkaar stoppen:

<?
function DatumVanWeek($iWeek, $iYear)
{
# Eerste dag van het jaar
$firstDay = date('w',mktime(0,0,0,1,1,$iYear));

# Voor de berekening moet zondag dag 7 zijn. Als je
# PHP 5.1.0 hebt, kun je ook date('N',$tmp) doen,
# dan is de volgende regel niet nodig.
if ($firstDay == 0) { $firstDay = 7; }

# Vind nu de 1e maandag van het jaar
$iFirstWeek = mktime(0,0,0,1,1 + ((8-$firstDay)%7),$year);

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

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

echo 'Eerste: ' . date('r',$eerste) . ', laatste: ' . date('r',$laatste);
}

DatumVanWeek(35, 2006);
?>
Willem vp schreef op 08.01.2006 15:13
Kwestie van code bij elkaar stoppen:

<?
function DatumVanWeek($iWeek, $iYear)
{
# Eerste dag van het jaar
$firstDay = date('w',mktime(0,0,0,1,1,$iYear));

# Voor de berekening moet zondag dag 7 zijn. Als je
# PHP 5.1.0 hebt, kun je ook date('N',$tmp) doen,
# dan is de volgende regel niet nodig.
if ($firstDay == 0) { $firstDay = 7; }

# Vind nu de 1e maandag van het jaar
$iFirstWeek = mktime(0,0,0,1,1 + ((8-$firstDay)%7),$year);

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

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

echo 'Eerste: ' . date('r',$eerste) . ', laatste: ' . date('r',$laatste);
}

DatumVanWeek(35, 2006);
?>


Leuke code. Erg interessant. Ik ben daar ook al een hele tijd mee bezig geweest en ben er nog niet uit.

Er zit wel een klein typfoutje in:
$iFirstWeek = mktime(0,0,0,1,1 + ((8-$firstDay)%7),$year);
$year moet $iYear zijn.

Maar hoe mooi ik het ook vind, het is nog niet perfect. Als ik b.v. DatumVanWeek(1, 2002) doe krijg ik als antwoord maandag 7 jan 2002 en zondag 13 jan 2002. Maar die zitten beide in week 2 en niet in week 1. En dat is precies waar ik al zolang mee aan het kl**ien ben.

Denk jij dat je dit ook kan oplossen?
@Willem vp:

Ik hoop dat jij er geen bezwaar tegen hebt. Maar ik heb enkele aanpassingen aan je script verricht. Het is nu geheel correct. Het probleem uit mijn vorige post is opgelost.

<?php
function DatumVanWeek($iWeek, $iYear)
{
# Ingevoerde weekwaarde onthouden
$Check = $iWeek;

# Eerste dag van het jaar
$firstDay = date('w',mktime(0,0,0,1,1,$iYear));

# Voor de berekening moet zondag dag 7 zijn. Als je
# PHP 5.1.0 hebt, kun je ook date('N',$tmp) doen,
# dan is de volgende regel niet nodig.
if ($firstDay == 0) { $firstDay = 7; }

# Vind nu de 1e maandag van het jaar
$iFirstWeek = mktime(0,0,0,1,1 + ((8-$firstDay)%7), $iYear);

# Als het niet week 1 is, zitten we in het jaar ervoor
if (date("W", $iFirstWeek) != 1) { $iWeek--; }

# Eerste dag van de week
$eerste = mktime(0, 0, 0, date('m', $iFirstWeek), date('d', $iFirstWeek) + 7*($iWeek-1), date('Y', $iFirstWeek));

# Laatste dag van de week
$laatste = mktime(0,0,0,date('m', $eerste),date('d', $eerste) + 6,date('Y',$eerste));

# Checken of het in het goede jaar valt
$lastDay = mktime(0,0,0,12,31,$iYear);
$bool = true;
$bool = ($bool AND (date("W", $eerste) == $Check OR $Check >= 2));
$bool = ($bool AND (date("W", $lastDay) == $Check OR $Check <= 52));

if ($bool)
{ echo 'Eerste: ' . date('r', $eerste) . '<br />Laatste: ' . date('r', $laatste) . '<br />';
} else { echo 'Het jaar ' . $iYear . ' heeft geen week ' . $Check . '.<br /><br />';
}
}

DatumVanWeek(35, 2006);
?>

Edit: Compleet woord vergeten.
SanThe schreef op 09.01.2006 01:37

Edit: Compleet woord vergeten.


Altijd lastig :P
Leuk topic! Ik heb ook iets gemaakt:

<?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);
$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));
}
?>

Uitleg:
1) de functie doet een minimale check op het weeknummer
<?php
if ($weeknr < 0 || $weeknr > 53) return false;
?>

2) dan pakt hij de timestamp van 1 januari van het bewuste jaar
<?php
$timestamp_1jan = strtotime ('1 january ' . $year);
?>

3) daarbij telt hij het gegeven aantal weken op en pakt die timestamp ook
<?php
$timestamp_week = strtotime ('+' . $weeknr . ' week', $timestamp_1jan);
?>

4) dan rekent hij de weekdag uit en timestamps van de eerste en de laatste dag van die week
<?php
$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);
?>

5) De functie geeft een array terug met de eerste en de laatste dag van de week in
een formaat dat je zelf opgeeft. Als je niets meegeeft, gebruikt hij '%d-%m-%Y'.
<?php
return array (strftime ($format, $begindatum), strftime ($format, $einddatum));
?>

Voorbeelden:

<?php
print_r (dates_from_weeknr (1, 2006, '%d-%m'));
print_r (dates_from_weeknr (1, 2006));
?>

edit: iets duidelijker op proberen te schrijven
Ik bedenk me net dat het fout gaat als 1 januari op een maandag valt. Ga ik nog iets op verzinnen.

Reageren