Hallo allemaal,

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.
De tijd (time) wordt op alle servers gesynchroniseerd met de wereldtijd.

Het lijkt mij dat je in de database dan dus TIMESTAMP gebruikt.

Hoe je het weergeeft is afhankelijk van de tijdzone waarin je leeft.
<?php
$a=time();

date_default_timezone_set('Europe/Amsterdam');
echo '<br/>'.date('d-m-Y H:i:s', $a);

date_default_timezone_set('America/Los_Angeles');
echo '<br/>'.date('d-m-Y H:i:s', $a);
?>

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.
Ik wil zeg maar zoiets, dus een overzicht op dezelfde pagina (tijden even verzonnen):

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.
Ik zou de tijden dan als UTC opslaan, dan kan je veel makkelijker rekenen met tijdzones en dienst intervallen. Kan je dan [php]date_default_timezone_set[/php] en [php]strftime[/php] de juiste tijd tonen. Moet je alleen de landen van de bezoekers koppelen met de juiste tijdzone.

Ik heb misschien iets bedacht. Ik zou een table kunnen toevoegen aan de database met alle tijdzones in de wereld. Ik heb al een table met steden, daar zou ik dan de betreffende tijdzone aan kunnen toevoegen.

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.
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.
Oké, ik zou dus zoiets moeten doen?

<?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');

?>


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?
Volgens mij moet je de functionele vereiste "vandaag" vooral niet té letterlijk formuleren. Als een wedstrijd om 00:30 's nachts begint in de tijdzone van de gebruiker, dan is dat namelijk "pas morgen". En dan zou je zo'n wedstrijd dus missen.

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.

Reageren