Datum uit weeknummers
Het script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
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');
}
?>
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');
}
?>
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 :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?
# 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 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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
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);
?>
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:
Kwestie van code bij elkaar stoppen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
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);
?>
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?
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?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);
?>
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.
Gewijzigd op 09/01/2006 01:43:00 door - SanThe -
SanThe:
Edit: Compleet woord vergeten.
Altijd lastig :P
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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));
}
?>
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
2) dan pakt hij de timestamp van 1 januari van het bewuste jaar
3) daarbij telt hij het gegeven aantal weken op en pakt die timestamp ook
4) dan rekent hij de weekdag uit en timestamps van de eerste en de laatste dag van die week
Code (php)
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'.
Code (php)
Voorbeelden:
Code (php)
edit: iets duidelijker op proberen te schrijven
Gewijzigd op 09/01/2006 10:01:00 door Jan Koehoorn
Ik bedenk me net dat het fout gaat als 1 januari op een maandag valt. Ga ik nog iets op verzinnen.
Grinnnnn zo leuk dat je dan zelf weer achter een foutje komt!! Echt heel mooi gedaan en voor beide CHAPEAU.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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));
}
?>
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.
Bijvoorbeeld 2001 ligt 1 januari op een maandag. Die heb ik net getest, en dit gaat goed:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>';
?>
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.
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:
Volgens ISO8601 is week1 de week waarin de eerste donderdag zit.
Dit zal dan wel de oplossing zijn voor het grote puzzelstuk.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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));
}
?>
// 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:
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.