Tijden en tijdzones in MySQL en PHP
Ik heb een idee waarvan ik niet precies weet hoe ik dat het best kan uitwerken. Op mijn site wil ik wedstrijden laten zien die 'vandaag' worden gespeeld. Daarbij wil ik dan de tijd laten zien dat de wedstrijd begint voor de bezoeker en kunnen laten zien dat de wedstrijd bezig is of af is. Eventueel met een optie om dat om te zetten naar lokale tijden.
In de database wil ik dus de datum en tijd bewaren van een wedstrijd, ook plaats + land. Het punt is alleen dat die wedstrijden over de hele wereld plaats vinden, dus ik vermoed dat ik dan met tijdzones moet gaan rekenen? En speelt zomer- of wintertijd dan ook nog een rol? Ik raak een beetje verstrikt hoe ik dat moet uitwerken, zowel qua opslag in MySQL als hoe ik dat in PHP vervolgens moet gebruiken. Ik ben wel bekend met de PHP timezone functie op UTC om tijdverschillen te berekenen.
Hopelijk kunnen jullie me op weg helpen.
Het lijkt mij dat je in de database dan dus TIMESTAMP gebruikt.
Hoe je het weergeeft is afhankelijk van de tijdzone waarin je leeft.
Code (php)
Output:
05-06-2017 19:35:01
05-06-2017 10:35:01
Ok, maar hoe zou een TIMESTAMP in Mysql er dan uitzien voor een wedstrijd die in Amsterdam en in Los Angeles om 14.00 uur begint?
Ik zou gewoon opslaan als DATETIME, en met SET time_zone per pagina aan de slag gaan. Dan heb je meteen ook alle gevallen te pakken waar met/zonder zomertijd wordt gewerkt.
Wedstrijd 1: 05.00 uur (Tokyo)
Wedstrijd 2: 11.00 uur (Amsterdam)
Wedstrijd 3: 12.00 uur (Amsterdam)
Wedstrijd 4: 19.00 uur (New York)
Voorbeeld voor een bezoeker uit Nederland bv.
Ik zie nog niet echt hoe ik dit kan bereiken.
Gewijzigd op 05/06/2017 21:38:43 door G Jansma
date_default_timezone_set en strftime de juiste tijd tonen. Moet je alleen de landen van de bezoekers koppelen met de juiste tijdzone.
Ik zou de tijden dan als UTC opslaan, dan kan je veel makkelijker rekenen met tijdzones en dienst intervallen. Kan je dan Dus table tijdzones:
276,"NL","Europe/Amsterdam"
En dan aan elke stad in NL die 276 toevoegen als tijdzone-waarde. Nadeel is dat ik dan bij landen met meerdere tijdzones moet uitzoeken in welke tijdzone een stad ligt. Voordeel is dat ik dan niet constant na hoef te gaan in welke tijdzone een plaats ligt bij invoer van een tijd.
Vervolgens zou ik dan de tijd kunnen opslaan als DATETIME en ophalen samen met de andere gegevens van de wedstrijd zoals de betreffende tijdzone, en verwerken in PHP zoals - San The - voorstelde. Zou dit zo kunnen werken of is dit te omslachtig gedacht?
Edit:
Klopt denk ik niet helemaal wat ik zeg, want ik moet natuurlijk weten hoelaat het in Amsterdam is als om 14.00 uur een wedstrijd in Los Angeles wordt gespeeld.
@Ariën: In dat geval moet ik tijden zelf gaan verrekenen bij invoer? Ik denk dat het een stuk makkelijker is als ik gewoon lokale tijden kan invoeren.
Gewijzigd op 05/06/2017 22:37:44 door G Jansma
Die tabel die je noemt is ook al onderdeel van PHP, en in mindere mate ook van MySQL. Je zou het dus nog iets verder kunnen vereenvoudigen.
G Jansma op 05/06/2017 22:24:53:
@Ariën: In dat geval moet ik tijden zelf gaan verrekenen bij invoer? Ik denk dat het een stuk makkelijker is als ik gewoon lokale tijden kan invoeren.
Nee, want tijdfuncties gebruiken doorgaans UTC al als uitgangszone / tussenstap, sla de functies er maar eens op na. Alles opslaan als UTC lijkt mij het makkelijkst. Dit moet je wel ergens documenteren of moet ergens uit blijken, en je moet uiteraard bij het invoeren opgeven welke regio het betreft zodat dit automatisch (omdat de functies met UTC werken) wordt omgerekend.
Een bijkomend voordeel is dat als je in tijdszone A zit en je wilt een wedstrijd in tijdszone B zien dan hoef je maar één keer een tijd om te rekenen, namelijk [tijd van de wedstrijd in UTC] --> [jouw tijdszone A], om erachter te komen hoe laat een wedstrijd jouw lokale tijd wordt uitgezonden.
Gewijzigd op 06/06/2017 02:29:04 door Thomas van den Heuvel
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
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
<?php
//ophalen uit database
$datetime1 = '2018-01-01 12:00:00';
$timezone1 = 'Asia/Tokyo';
$datetime2 = '2018-01-01 12:00:00';
$timezone2 = 'Europe/Amsterdam';
$datetime3 = '2018-01-01 12:00:00';
$timezone3 = 'America/New_York';
//ophalen uit browser
$user_timezone = 'Europe/Amsterdam';
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', $datetime1, new DateTimeZone($timezone1));
$date1 ->setTimeZone(new DateTimeZone($user_timezone));
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', $datetime2, new DateTimeZone($timezone2));
$date2 ->setTimeZone(new DateTimeZone($user_timezone));
$date3 = DateTime::createFromFormat('Y-m-d H:i:s', $datetime3, new DateTimeZone($timezone3));
$date3 ->setTimeZone(new DateTimeZone($user_timezone));
echo $date1->format('Y-m-d H:i');
echo "<br>";
echo $date2->format('Y-m-d H:i');
echo "<br>";
echo $date3->format('Y-m-d H:i');
?>
//ophalen uit database
$datetime1 = '2018-01-01 12:00:00';
$timezone1 = 'Asia/Tokyo';
$datetime2 = '2018-01-01 12:00:00';
$timezone2 = 'Europe/Amsterdam';
$datetime3 = '2018-01-01 12:00:00';
$timezone3 = 'America/New_York';
//ophalen uit browser
$user_timezone = 'Europe/Amsterdam';
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', $datetime1, new DateTimeZone($timezone1));
$date1 ->setTimeZone(new DateTimeZone($user_timezone));
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', $datetime2, new DateTimeZone($timezone2));
$date2 ->setTimeZone(new DateTimeZone($user_timezone));
$date3 = DateTime::createFromFormat('Y-m-d H:i:s', $datetime3, new DateTimeZone($timezone3));
$date3 ->setTimeZone(new DateTimeZone($user_timezone));
echo $date1->format('Y-m-d H:i');
echo "<br>";
echo $date2->format('Y-m-d H:i');
echo "<br>";
echo $date3->format('Y-m-d H:i');
?>
Een bijkomend probleem waar ik tegen aanloop is dat je met PHP kennelijk niet de tijdzone van een bezoeker kan achterhalen? Ik heb geen users op mijn site, dus zelf laten instellen kan niet. Ik begrijp dat ik dan met Javascript moet werken, en dan de pagina moet verversen en de tijdzone meegeven als session? Dat lijkt me niet echt wenselijk namelijk. Wat zou de beste optie daarvoor zijn?
@Ben van Velzen: Hoe bedoel je dat precies? Hoe werkt dat in Mysql dan?
Waarschijnlijk is een ruimer criterium zoals "de komende 24 uur" praktischer.
Vergelijk het met een tv-gids. Je wilt niet weten welke films er "vandaag" op tv zijn, want aan films die al zijn afgelopen heb je niets en omgekeerd wil je de films die 's nachts na 00:00 beginnen misschien juist wel zien.
Correct, hiervoor zou je naar een third party moeten gaan. De google maps API bijvoorbeeld heeft timezone offsets om te gebruiken.
Binnen mysql zou je iets kunnen doen als:
@Ben: Ik snap niet zo goed wat die SET time_zone kan doen als ik de datum en tijdzone afzonderlijk ophaal uit Mysql? Wat betreft die API is dat misschien een optie, al ben ik tot dusver niet zo bekend met Javascript en kan ik die API's soms maar moeilijk doorgronden.
Maar wat denken jullie van het scriptje? Is dit de way to go?
Misschien een beetje slordig nog.
Maar het werkt.
Is de tekst in het overzicht groen dan is de wedstrijd bezig.
Is het rood dan is die voorbij.
Uiteraard moet je het geheel aan jouw eisen e.d. aanpassen.
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<?php
/*
Database Test@2017
Tabel timezones
id INT AUTO_INCREMENT
zone VARCHAR 40
Tabel wedstrijden
id INT AUTO_INCREMENT
naam VARCHAR 40
begintijd DATETIME
eindtijd DATETIME
plaats VARCHAR 40
zone INT
*/
ini_set('display_errors',1);
error_reporting(E_ALL);
date_default_timezone_set('Europe/Amsterdam');
session_start();
$maxSteden = 5;
$siteMySQL['host'] = 'localhost';
$siteMySQL['user'] = 'Test@2017';
$siteMySQL['pass'] = 'Test@2017';
$siteMySQL['db'] = 'Test@2017';
$mysqli = @mysqli_connect($siteMySQL['host'], $siteMySQL['user'], $siteMySQL['pass'], $siteMySQL['db']);
# Errorafhandeling: Kan je iets moois van maken
function showError($regel, $error)
{ exit('Error op regel '.$regel.': '.$error);
}
# Alle bestaande timezones uit de database halen
$sql = " SELECT zone
FROM timezones
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
$checkTimezonesArray = array();
while($row = @mysqli_fetch_assoc($result))
{ $checkTimezonesArray[] = $row['zone'];
}
# Alle bestaande timezones van PHP ophalen
$phpTimezonesArray = timezone_identifiers_list();
# Javascript voor het formulier
?>
<script type="text/javascript">
phpTimezonesArray = [];
function setSelect(value)
{ for(i=0;i<phpTimezonesArray.length;i++)
{ if(phpTimezonesArray[i].plaats.toLowerCase().indexOf(value.toLowerCase()) >= 0)
{ document.getElementById('plaats').value = phpTimezonesArray[i].plaats;
document.getElementById(phpTimezonesArray[i].zone).selected = 'true';
}
}
}
function setStad(value, id)
{ for(i=0;i<phpTimezonesArray.length;i++)
{ if(phpTimezonesArray[i].plaats.toLowerCase().indexOf(value.toLowerCase()) >= 0 && value != '')
{ document.getElementById('stad'+id).value = phpTimezonesArray[i].plaats;
}
}
}
</script>
<?php
foreach($phpTimezonesArray as $phpTimezone)
{ # Geef de timezones door aan Javascript
echo '<script type="text/javascript">';
$hulp = json_encode(array('plaats'=>substr(strrchr($phpTimezone, '/'), 1), 'zone'=>$phpTimezone));
echo 'phpTimezonesArray.push(JSON.parse(\''.$hulp.'\'));';
echo '</script>';
# Check of de PHP-timezone al in de database zit
if(!in_array($phpTimezone, $checkTimezonesArray))
{ # Zo niet INSERT
echo $phpTimezone.' is toegevoegd.<br/>';
$sql = " INSERT INTO timezones
(
zone
)
VALUES
(
'".@mysqli_real_escape_string($mysqli, $phpTimezone)."'
)
";
if(@mysqli_query($mysqli, $sql) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
}
}
# Wedstrijdenoverzicht met de tijden uit de timezone
function showWedstrijden($zone='Amsterdam')
{ global $mysqli;
$sql = " SELECT zone
FROM timezones
WHERE zone LIKE '%/".@mysqli_real_escape_string($mysqli, $zone)."'
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
$row = @mysqli_fetch_assoc($result);
if(@mysqli_num_rows($result) > 0)
{ $timezone = $row['zone'];
}
$sql = " SELECT w.naam, w.begintijd, w.eindtijd, w.plaats, t.zone
FROM timezones as t, wedstrijden as w
WHERE w.zone = t.id
ORDER BY w.begintijd ASC
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
date_default_timezone_set($timezone);
echo '<br/><strong>Tijdzone '.$timezone.'</strong> '.date('d-m-Y H:i').'<br/>';
while($row = @mysqli_fetch_assoc($result))
{ date_default_timezone_set($timezone);
$now = date('YmdHis');
date_default_timezone_set('Europe/Amsterdam');
$begintijd = strtotime($row['begintijd']);
$eindtijd = strtotime($row['eindtijd']);
date_default_timezone_set($timezone);
$style = ($now > date('YmdHis',$begintijd)) ? ' style="color:green;"' : '';
$style = ($now > date('YmdHis',$eindtijd)) ? ' style="color:red;"' : $style;
echo '<span'.$style.'>'.date('d-m-Y H:i',$begintijd).' '.date('d-m-Y H:i',$eindtijd).' '.$row['naam'].' '.$row['plaats'].' '.$row['zone'].'</span><br/>';
}
}
# Afhandeling formulieren
if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['form']))
{ switch($_POST['form'])
{ case 'wedstrijd' :
# Alle tijden worden in timezone Europe/Amsterdam in de databse gezet
$sql = " SELECT id, zone
FROM timezones
WHERE zone = '".@mysqli_real_escape_string($mysqli, $_POST['zone'])."'
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
$row = @mysqli_fetch_assoc($result);
date_default_timezone_set($row['zone']);
$begintijd = strtotime($_POST['begintijd']);
$eindtijd = strtotime($_POST['eindtijd']);
date_default_timezone_set('Europe/Amsterdam');
$sql = " INSERT INTO wedstrijden
(
naam,
begintijd,
eindtijd,
plaats,
zone
)
VALUES
(
'".@mysqli_real_escape_string($mysqli, $_POST['naam'])."',
'".date('Y-m-d H:i:00', $begintijd)."',
'".date('Y-m-d H:i:00', $eindtijd)."',
'".@mysqli_real_escape_string($mysqli, $_POST['plaats'])."',
'".$row['id']."'
)
";
if(@mysqli_query($mysqli, $sql) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
break;
case 'overzicht' :
# De steden voor het overzicht in de session zetten
for($i=1;$i<=$maxSteden;$i++)
{ $_SESSION['stad'.$i] = (empty($_POST['stad'.$i])) ? '' : $_POST['stad'.$i];
}
break;
}
}
# De formulieren
?>
<div style="float:left;">
<strong>Ingeven van een wedstrijd</strong><br/>
<form action="" method="post">
<input type="hidden" name="form" value="wedstrijd"/>
<input name="naam"/> Naam Wedstrijd<br/>
<input id="plaats" list="plaatsen" name="plaats" autocomplete="off" onchange="setSelect(this.value);"/> Naam van de Stad<br/>
<datalist id="plaatsen">
<?php
foreach($phpTimezonesArray as $phpTimezone)
{ echo '<option value="'.(substr(strrchr($phpTimezone, '/'), 1)).'">';
}
?>
</datalist>
<input name="begintijd"/> Locale Begin Datum en Tijd (YYYY-MM-DD HH:MM)<br/>
<input name="eindtijd"/> Locale Eind Datum en Tijd (YYYY-MM-DD HH:MM)<br/>
<select name="zone">
<option id="leeg"></option>
<?php
foreach($phpTimezonesArray as $timezone)
{ echo '<option id="'.$timezone.'">'.$timezone.'</option>';
}
?>
</select> Tijdzone<br/>
<input type="submit"/><br/><br/>
</form>
</div>
<div style="float:right;text-align:right;">
<strong>Steden van het overzicht</strong><br/>
<form action="" method="post">
<input type="hidden" name="form" value="overzicht"/>
<?php
for($i=1;$i<=$maxSteden;$i++)
{ echo 'Stad '.$i.' <input id="stad'.$i.'" list="plaatsen" name="stad'.$i.'" autocomplete="off" onchange="setStad(this.value, '.$i.')" value="'.(isset($_SESSION['stad'.$i]) ? $_SESSION['stad'.$i] : '').'"/><br/>';
}
?>
<input type="submit"/><br/><br/>
</form>
</div>
<div style="clear:both;"></div>
<?php
# De overzichten
for($i=1;$i<=$maxSteden;$i++)
{ if(!empty($_SESSION['stad'.$i]))
{ echo '<div style="margin:0px auto;width:600px;">';
showWedstrijden($_SESSION['stad'.$i]);
echo '</div>';
}
}
?>
/*
Database Test@2017
Tabel timezones
id INT AUTO_INCREMENT
zone VARCHAR 40
Tabel wedstrijden
id INT AUTO_INCREMENT
naam VARCHAR 40
begintijd DATETIME
eindtijd DATETIME
plaats VARCHAR 40
zone INT
*/
ini_set('display_errors',1);
error_reporting(E_ALL);
date_default_timezone_set('Europe/Amsterdam');
session_start();
$maxSteden = 5;
$siteMySQL['host'] = 'localhost';
$siteMySQL['user'] = 'Test@2017';
$siteMySQL['pass'] = 'Test@2017';
$siteMySQL['db'] = 'Test@2017';
$mysqli = @mysqli_connect($siteMySQL['host'], $siteMySQL['user'], $siteMySQL['pass'], $siteMySQL['db']);
# Errorafhandeling: Kan je iets moois van maken
function showError($regel, $error)
{ exit('Error op regel '.$regel.': '.$error);
}
# Alle bestaande timezones uit de database halen
$sql = " SELECT zone
FROM timezones
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
$checkTimezonesArray = array();
while($row = @mysqli_fetch_assoc($result))
{ $checkTimezonesArray[] = $row['zone'];
}
# Alle bestaande timezones van PHP ophalen
$phpTimezonesArray = timezone_identifiers_list();
# Javascript voor het formulier
?>
<script type="text/javascript">
phpTimezonesArray = [];
function setSelect(value)
{ for(i=0;i<phpTimezonesArray.length;i++)
{ if(phpTimezonesArray[i].plaats.toLowerCase().indexOf(value.toLowerCase()) >= 0)
{ document.getElementById('plaats').value = phpTimezonesArray[i].plaats;
document.getElementById(phpTimezonesArray[i].zone).selected = 'true';
}
}
}
function setStad(value, id)
{ for(i=0;i<phpTimezonesArray.length;i++)
{ if(phpTimezonesArray[i].plaats.toLowerCase().indexOf(value.toLowerCase()) >= 0 && value != '')
{ document.getElementById('stad'+id).value = phpTimezonesArray[i].plaats;
}
}
}
</script>
<?php
foreach($phpTimezonesArray as $phpTimezone)
{ # Geef de timezones door aan Javascript
echo '<script type="text/javascript">';
$hulp = json_encode(array('plaats'=>substr(strrchr($phpTimezone, '/'), 1), 'zone'=>$phpTimezone));
echo 'phpTimezonesArray.push(JSON.parse(\''.$hulp.'\'));';
echo '</script>';
# Check of de PHP-timezone al in de database zit
if(!in_array($phpTimezone, $checkTimezonesArray))
{ # Zo niet INSERT
echo $phpTimezone.' is toegevoegd.<br/>';
$sql = " INSERT INTO timezones
(
zone
)
VALUES
(
'".@mysqli_real_escape_string($mysqli, $phpTimezone)."'
)
";
if(@mysqli_query($mysqli, $sql) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
}
}
# Wedstrijdenoverzicht met de tijden uit de timezone
function showWedstrijden($zone='Amsterdam')
{ global $mysqli;
$sql = " SELECT zone
FROM timezones
WHERE zone LIKE '%/".@mysqli_real_escape_string($mysqli, $zone)."'
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
$row = @mysqli_fetch_assoc($result);
if(@mysqli_num_rows($result) > 0)
{ $timezone = $row['zone'];
}
$sql = " SELECT w.naam, w.begintijd, w.eindtijd, w.plaats, t.zone
FROM timezones as t, wedstrijden as w
WHERE w.zone = t.id
ORDER BY w.begintijd ASC
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
date_default_timezone_set($timezone);
echo '<br/><strong>Tijdzone '.$timezone.'</strong> '.date('d-m-Y H:i').'<br/>';
while($row = @mysqli_fetch_assoc($result))
{ date_default_timezone_set($timezone);
$now = date('YmdHis');
date_default_timezone_set('Europe/Amsterdam');
$begintijd = strtotime($row['begintijd']);
$eindtijd = strtotime($row['eindtijd']);
date_default_timezone_set($timezone);
$style = ($now > date('YmdHis',$begintijd)) ? ' style="color:green;"' : '';
$style = ($now > date('YmdHis',$eindtijd)) ? ' style="color:red;"' : $style;
echo '<span'.$style.'>'.date('d-m-Y H:i',$begintijd).' '.date('d-m-Y H:i',$eindtijd).' '.$row['naam'].' '.$row['plaats'].' '.$row['zone'].'</span><br/>';
}
}
# Afhandeling formulieren
if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['form']))
{ switch($_POST['form'])
{ case 'wedstrijd' :
# Alle tijden worden in timezone Europe/Amsterdam in de databse gezet
$sql = " SELECT id, zone
FROM timezones
WHERE zone = '".@mysqli_real_escape_string($mysqli, $_POST['zone'])."'
";
if(($result = @mysqli_query($mysqli, $sql)) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
$row = @mysqli_fetch_assoc($result);
date_default_timezone_set($row['zone']);
$begintijd = strtotime($_POST['begintijd']);
$eindtijd = strtotime($_POST['eindtijd']);
date_default_timezone_set('Europe/Amsterdam');
$sql = " INSERT INTO wedstrijden
(
naam,
begintijd,
eindtijd,
plaats,
zone
)
VALUES
(
'".@mysqli_real_escape_string($mysqli, $_POST['naam'])."',
'".date('Y-m-d H:i:00', $begintijd)."',
'".date('Y-m-d H:i:00', $eindtijd)."',
'".@mysqli_real_escape_string($mysqli, $_POST['plaats'])."',
'".$row['id']."'
)
";
if(@mysqli_query($mysqli, $sql) === false)
{ showError(__LINE__, mysqli_error($mysqli));
}
break;
case 'overzicht' :
# De steden voor het overzicht in de session zetten
for($i=1;$i<=$maxSteden;$i++)
{ $_SESSION['stad'.$i] = (empty($_POST['stad'.$i])) ? '' : $_POST['stad'.$i];
}
break;
}
}
# De formulieren
?>
<div style="float:left;">
<strong>Ingeven van een wedstrijd</strong><br/>
<form action="" method="post">
<input type="hidden" name="form" value="wedstrijd"/>
<input name="naam"/> Naam Wedstrijd<br/>
<input id="plaats" list="plaatsen" name="plaats" autocomplete="off" onchange="setSelect(this.value);"/> Naam van de Stad<br/>
<datalist id="plaatsen">
<?php
foreach($phpTimezonesArray as $phpTimezone)
{ echo '<option value="'.(substr(strrchr($phpTimezone, '/'), 1)).'">';
}
?>
</datalist>
<input name="begintijd"/> Locale Begin Datum en Tijd (YYYY-MM-DD HH:MM)<br/>
<input name="eindtijd"/> Locale Eind Datum en Tijd (YYYY-MM-DD HH:MM)<br/>
<select name="zone">
<option id="leeg"></option>
<?php
foreach($phpTimezonesArray as $timezone)
{ echo '<option id="'.$timezone.'">'.$timezone.'</option>';
}
?>
</select> Tijdzone<br/>
<input type="submit"/><br/><br/>
</form>
</div>
<div style="float:right;text-align:right;">
<strong>Steden van het overzicht</strong><br/>
<form action="" method="post">
<input type="hidden" name="form" value="overzicht"/>
<?php
for($i=1;$i<=$maxSteden;$i++)
{ echo 'Stad '.$i.' <input id="stad'.$i.'" list="plaatsen" name="stad'.$i.'" autocomplete="off" onchange="setStad(this.value, '.$i.')" value="'.(isset($_SESSION['stad'.$i]) ? $_SESSION['stad'.$i] : '').'"/><br/>';
}
?>
<input type="submit"/><br/><br/>
</form>
</div>
<div style="clear:both;"></div>
<?php
# De overzichten
for($i=1;$i<=$maxSteden;$i++)
{ if(!empty($_SESSION['stad'.$i]))
{ echo '<div style="margin:0px auto;width:600px;">';
showWedstrijden($_SESSION['stad'.$i]);
echo '</div>';
}
}
?>
Gewijzigd op 07/06/2017 12:51:38 door - SanThe -
Wow, wat een uitgebreid script. Ik kom hier zeker op terug als ik de tijd heb om dit even allemaal uit te vogelen. Enorm bedankt alvast!
Ik was zelf ook wel nieuwsgierig geworden hoe dit nou zou moeten werken. Het was leuk en leerzaam om het uit te zoeken. Het werkt hier perfect.
Ik hoor het wel als er vragen zijn.
Ik heb het allemaal bekeken, en het werk erg mooi. Bedankt daarvoor! Het enige probleem waar ik nog tegen aan loop is dat ik direct wil nagaan in welke tijdzone iemand zit. Nu voer je de locaties zelf in, maar dat is dus iets wat ik niet wil. Enig idee hoe dat het best zou kunnen?
https://stackoverflow.com/questions/743505/how-to-get-time-zone-through-ip-address-in-php. Maar ook hier zitten nog haken en ogen aan.
Wil je de gebruiker op maat gesneden tijden laten zien dan zou ik er toch voor kiezen om een account aan te bieden aan de gebruiker.
Het is internet he. Een request kan uit elke uithoek van de wereld komen maar ziet er altijd hetzelfde uit. De enige kleine houvast is een ip adres. Zie Wil je de gebruiker op maat gesneden tijden laten zien dan zou ik er toch voor kiezen om een account aan te bieden aan de gebruiker.
Cookie niet goed genoeg om een voorkeurstijdzone te onthouden? :/
Als je al een useraccount-systeem hebt, dan kan je de tijdzone prima opslaan. Je moet wel rekening houden met de wintertijd, want dan verandert de uur-interval ook. Of sla in zijn profiel op in welk land hij woont, en stem de tijdzones daarop af.
Ik denk dat grotere sites wel met landherkenning werken en Geo2IP databases, en alle landen per tijdzone hebben ingedeeld. Er is zelfs een complete dataset voor in diverse formaten.
Gewijzigd op 14/06/2017 01:01:02 door - Ariën -
Ik selecteer namelijk op basis van de datum van de tijdzone, en dan op de wedstrijden die dag. Maarja, als je dan in Australië woont ben je dus al een dag verder terwijl er in de USA nog wedstrijden moeten worden verreden. Niet zo slim dus. Precies het probleem wat Ward hier al eerder schetste met een tv-gids. Nu krijg je dus afhankelijk van je tijdzone wisselende resultaten, maar dat moet dus eigenlijk niet nee.
Maar kan ik vanuit Mysql zelf al ophalen welke wedstrijden er de komende 24 uur (en afgelopen 12 uur) zijn? Aangezien de tijden allemaal UTC (?) zijn, en die vervolgens met tijdzone worden omgezet naar de daadwerkelijke tijd. Of moet ik dat eerst met PHP ophalen, de tijden omzetten, en daarmee opnieuw de betreffende wedstrijden ophalen uit Mysql?