Toevoegen link bij datum
De weeknummers mogen niet klikbaar worden, want soms starten de weken in het te maken rooster niet op een maandag IVM feestdagen worden er vaak aparte roosters gemaakt.
Dus alleen de data moeten klikbaar zijn.
Daarna de vraag, kan ik met variabelen uit dit script de dag, maand en het jaar gescheiden doorsturen naar het rooster? die variabelen kan ik namelijk nergens ontdekken?
Alvast bedankt!
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<html>
<head>
<title>Kalender</title>
<style type="text/css">
.td {font-weight: bold; background-color: #00cccc;} .tm {font-weight: bold; background-color: #00cccc;} .hd {font-weight: bold;} .am {color: #cccccc;} .bd {background-color: #cccccc; font-weight: bold;} td {font-family: Arial; font-size: 9pt;}
</style>
</head>
<body>
<?php
function drukmaandaf($fm, $fy) {
// zelfgedefinieerde dag- en maandnamen
$dagnaam = array(0 => "ma", "di", "wo", "do", "vr", "za", "zo");
$maandnaam = array(1 => "Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December");
$nu = time();
$by = (date("Y", $nu) == $fy);
$bm = (date("n", $nu) == $fm);
// zoek de eerste maandag van de week waarin de maand $fm begint
$eerstedag = mktime(0, 0, 0, $fm, 1, $fy);
if(date("w", $eerstedag) <> 1) {
// eerste dag van de maand is geen maandag
$eerstemaandag = mktime(0,0,0,$fm,1-(!date("w", $eerstedag) ? 6 : date("w", $eerstedag) - 1),$fy);
} else {
// eerste dag van de maand valt op een maandag
$eerstemaandag = $eerstedag;
}
// zoek de laatste zondag van de week waarin de maand $fm eindigt
$laatstedag = mktime(0, 0, 0, $fm, date("t", mktime(0, 0, 0, $fm, 1, $fy)),$fy);
if(date("w", $laatstedag)) {
// laatste dag van de maand is geen zondag
$laatstezondag = mktime(0, 0, 0, $fm+1, 7 - date("w",$laatstedag), $fy);
} else {
// laatste dag van de maand valt op een zondag
$laatstezondag = $laatstedag;
}
// we gaan kijken in hoeveel kalenderweken een maand zit. Hierbij moeten we op twee speciale gevallen
// letten: de eerste maandag van januari en de laatste zondag van december, deze kunnen namelijk in
// een ander jaar zitten en hierdoor de berekening van het het aantal weken verknoeien.
$edz = 0; // extra dagen die aan de zondag toegevoegd moeten worden
if($fm == 1 && date("Y", $eerstemaandag) <> $fy) {
// de maand waar we naar kijken is januari, en de eerste dag van de week waarin januari begint
// valt niet op een maandag (en niet in het huidige jaar)
// - we dienen dus dagen toe te voegen aan de laatste zondag...
$edz = date("z", mktime(0,0,0,12,31,$fy-1))+1;
}
if($fm == 12 && date("Y", $laatstezondag) <> $fy) {
// de maand waar we naar kijken is december, en de laatste dag van de week waarin december eindigt
// valt niet op een zondag (en niet in het huidige jaar)
// - we dienen dus dagen toe te voegen aan de laatste zondag...
$edz = date("z", mktime(0,0,0,12,31,$fy))+1;
}
// we kunnen nu het aantal weken berekenen - het verschil tussen de
// eerste maandag en de laatste zondag +1 is altijd deelbaar door 7.
$aantalweken = (date("z", $laatstezondag) + $edz - date("z", $eerstemaandag) + 1)/7;
// we kunnen nu mbv $eerstemaandag en $aantalweken de kalender van een maand af gaan drukken
echo "<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n";
echo "<tr><td class=\"".($by && $bm ? "tm" : "hd")."\" colspan=\"".($aantalweken+1)."\" align=\"center\">";
echo $maandnaam[$fm]." ".$fy;
echo "</td></tr>\n";
// weeknummers afdrukken
echo "<tr><td> </td>";
for($i=0; $i < $aantalweken; $i++) {
$week = date("W", $eerstemaandag + $i * 604800 + 3600); // seconden in een week + een uur
echo "<td class=\"bd\">".(($week < 10) ? "0".$week : $week)."</td>";
}
echo "</tr>";
// dagnamen en dagnummers afdrukken
for($d = 0; $d < 7; $d++) {
echo "<tr>\n";
echo "<td class=\"bd\">".$dagnaam[$d]."</td>\n";
for($w = 0; $w < $aantalweken; $w++) {
// in verband met zomer en wintertijd moet bij de dag een uur opgeteld worden
// anders krijg je 2x dezelfde dag achter elkaar
$dag = $eerstemaandag+($w*7+$d)*86400 + 3600;
$dagnummer = date("j", $dag);
$bd = (date("j", $nu) == $dagnummer);
echo "<td".(date("n", $dag) <> $fm ? " class=\"am\"": ($by && $bm && $bd ? " class=\"td\"" : "")).">";
echo ($dagnummer < 10 ? "0" : "").$dagnummer;
echo "</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
} // einde functie drukmaandaf
// extra - kijkt in de url of er al eens een kalendermaand is opgevraagd
if(!isset($_GET['m']) || !isset($_GET['y'])) {
$m = date("n");
$y = date("Y");
} else {
$m = $_GET['m'];
$y = $_GET['y'];
}
// drukt de kalender af
drukmaandaf($m, $y);
// linkjes naar vorige en volgende maand
echo "<a href=\"".$_SERVER['PHP_SELF']."?m=".($m > 1 ? $m-1 : 12)."&y=".($m > 1 ? $y : $y-1)."\">previous</a> | ";
echo "<a href=\"".$_SERVER['PHP_SELF']."?m=".($m < 12 ? $m+1: 1)."&y=".($m < 12 ? $y : $y+1)."\">next</a>";
?>
</body>
</html>
<head>
<title>Kalender</title>
<style type="text/css">
.td {font-weight: bold; background-color: #00cccc;} .tm {font-weight: bold; background-color: #00cccc;} .hd {font-weight: bold;} .am {color: #cccccc;} .bd {background-color: #cccccc; font-weight: bold;} td {font-family: Arial; font-size: 9pt;}
</style>
</head>
<body>
<?php
function drukmaandaf($fm, $fy) {
// zelfgedefinieerde dag- en maandnamen
$dagnaam = array(0 => "ma", "di", "wo", "do", "vr", "za", "zo");
$maandnaam = array(1 => "Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December");
$nu = time();
$by = (date("Y", $nu) == $fy);
$bm = (date("n", $nu) == $fm);
// zoek de eerste maandag van de week waarin de maand $fm begint
$eerstedag = mktime(0, 0, 0, $fm, 1, $fy);
if(date("w", $eerstedag) <> 1) {
// eerste dag van de maand is geen maandag
$eerstemaandag = mktime(0,0,0,$fm,1-(!date("w", $eerstedag) ? 6 : date("w", $eerstedag) - 1),$fy);
} else {
// eerste dag van de maand valt op een maandag
$eerstemaandag = $eerstedag;
}
// zoek de laatste zondag van de week waarin de maand $fm eindigt
$laatstedag = mktime(0, 0, 0, $fm, date("t", mktime(0, 0, 0, $fm, 1, $fy)),$fy);
if(date("w", $laatstedag)) {
// laatste dag van de maand is geen zondag
$laatstezondag = mktime(0, 0, 0, $fm+1, 7 - date("w",$laatstedag), $fy);
} else {
// laatste dag van de maand valt op een zondag
$laatstezondag = $laatstedag;
}
// we gaan kijken in hoeveel kalenderweken een maand zit. Hierbij moeten we op twee speciale gevallen
// letten: de eerste maandag van januari en de laatste zondag van december, deze kunnen namelijk in
// een ander jaar zitten en hierdoor de berekening van het het aantal weken verknoeien.
$edz = 0; // extra dagen die aan de zondag toegevoegd moeten worden
if($fm == 1 && date("Y", $eerstemaandag) <> $fy) {
// de maand waar we naar kijken is januari, en de eerste dag van de week waarin januari begint
// valt niet op een maandag (en niet in het huidige jaar)
// - we dienen dus dagen toe te voegen aan de laatste zondag...
$edz = date("z", mktime(0,0,0,12,31,$fy-1))+1;
}
if($fm == 12 && date("Y", $laatstezondag) <> $fy) {
// de maand waar we naar kijken is december, en de laatste dag van de week waarin december eindigt
// valt niet op een zondag (en niet in het huidige jaar)
// - we dienen dus dagen toe te voegen aan de laatste zondag...
$edz = date("z", mktime(0,0,0,12,31,$fy))+1;
}
// we kunnen nu het aantal weken berekenen - het verschil tussen de
// eerste maandag en de laatste zondag +1 is altijd deelbaar door 7.
$aantalweken = (date("z", $laatstezondag) + $edz - date("z", $eerstemaandag) + 1)/7;
// we kunnen nu mbv $eerstemaandag en $aantalweken de kalender van een maand af gaan drukken
echo "<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n";
echo "<tr><td class=\"".($by && $bm ? "tm" : "hd")."\" colspan=\"".($aantalweken+1)."\" align=\"center\">";
echo $maandnaam[$fm]." ".$fy;
echo "</td></tr>\n";
// weeknummers afdrukken
echo "<tr><td> </td>";
for($i=0; $i < $aantalweken; $i++) {
$week = date("W", $eerstemaandag + $i * 604800 + 3600); // seconden in een week + een uur
echo "<td class=\"bd\">".(($week < 10) ? "0".$week : $week)."</td>";
}
echo "</tr>";
// dagnamen en dagnummers afdrukken
for($d = 0; $d < 7; $d++) {
echo "<tr>\n";
echo "<td class=\"bd\">".$dagnaam[$d]."</td>\n";
for($w = 0; $w < $aantalweken; $w++) {
// in verband met zomer en wintertijd moet bij de dag een uur opgeteld worden
// anders krijg je 2x dezelfde dag achter elkaar
$dag = $eerstemaandag+($w*7+$d)*86400 + 3600;
$dagnummer = date("j", $dag);
$bd = (date("j", $nu) == $dagnummer);
echo "<td".(date("n", $dag) <> $fm ? " class=\"am\"": ($by && $bm && $bd ? " class=\"td\"" : "")).">";
echo ($dagnummer < 10 ? "0" : "").$dagnummer;
echo "</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
} // einde functie drukmaandaf
// extra - kijkt in de url of er al eens een kalendermaand is opgevraagd
if(!isset($_GET['m']) || !isset($_GET['y'])) {
$m = date("n");
$y = date("Y");
} else {
$m = $_GET['m'];
$y = $_GET['y'];
}
// drukt de kalender af
drukmaandaf($m, $y);
// linkjes naar vorige en volgende maand
echo "<a href=\"".$_SERVER['PHP_SELF']."?m=".($m > 1 ? $m-1 : 12)."&y=".($m > 1 ? $y : $y-1)."\">previous</a> | ";
echo "<a href=\"".$_SERVER['PHP_SELF']."?m=".($m < 12 ? $m+1: 1)."&y=".($m < 12 ? $y : $y+1)."\">next</a>";
?>
</body>
</html>
http://ditio.net/2008/06/03/php-datetime-and-datetimezone-tutorial/
Spijtig genoeg is het wat moeilijk om daar deftige informatie over te vinden, maar indien je er wat mee vertrouwd raakt, ben je verlost van die Unix seconden en van die mktime() <=> date() functies.
Misschien zouden dan de meeste van je problemen zich niet meer stellen.
Ik zie bv. zo'n lijn code: $week = date("W", $eerstemaandag + $i * 604800 + 3600);
Heb je rekening gehouden met zomeruur/winteruur; laat staan schrikkelseconden? Ik denk het niet.