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);
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);
?>
<?
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);
<?
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);
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.
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.
# 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));
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));
?>