Timestamp geeft foute tijd weer
Als ik het veld zichtbaar maak in een pagina is de tijd 3 uur eerder. Ik neem aan dat het verschil weer afwijkt met de wintertijd. Kan iemand mij helpen om zomer en winter de juiste Nederlandse tijd te laten zien.
De code die ik heb gebruikt is:
aanmaakdatum:
Alvast bedankt
Staat je server in een andere tijdszone?
Een timestamp (en ik denk dat je een datetime bedoelt omdat je deze ogenschijnlijk rechtstreeks weergeeft zonder formattering, of je moet de formattering regelen in de query zelf? dit zou ik ook afraden, zie verderop) zegt niets over de tijdszone. Een timestamp (of datetime) wordt waarschijnlijk in de UTC tijdszone opgeslagen (dit is nagenoeg gelijk aan GMT) als je geluk hebt (een un*x timestamp gebruikt per definitie UTC), maar beter is het om dit af te dwingen.
Vervolgens heb je een lokaal ingestelde tijdszone, deze zou je kunnen opvragen met date_default_timezone_get().
Op het moment dat je een timestamp/datetime een (alternatieve) formattering gaf voor weergave met datum/tijdfuncties van weleer (en sommige doen dit nog steeds) wordt deze automatisch omgezet van UTC naar de ingestelde / op dat moment geldende tijdszone. Dit is hoe dat soort functies werk(t)en. Het is dan dus wel zaak dat de tijdszone van de oorspronkelijke timestamp/datetime in UTC was anders gaat deze omrekening natuurlijk vaak mis.
Tegenwoordig heb je de DateTime() familie die alles een stuk eenvoudiger (of in ieder geval uniformer) maakt.
Wat je ook zou kunnen doen is dus één timestamp aanmaken, en vervolgens kun je heel makkelijk uitrekenen hoe laat het in andere tijdszones is, maar je zou dus ook allerlei berekeningen hiermee kunnen uitvoeren.
Maar als je tot nu toe nog niet over tijdszones hebt nagedacht wordt dat nu misschien... tijd 8). Sla bij voorkeur alles op in UTC zodat je altijd hetzelfde uitgangspunt hebt.
Voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
echo 'default timezone: '.date_default_timezone_get().'<br>'; // levert bijvoorbeed Europe/Berlin
$pdt = new DateTimeZone('America/Los_Angeles');
$amsterdam = new DateTimeZone('Europe/Amsterdam');
$utc = new DateTimeZone('UTC'); // DateTimeZone::UTC does not work?
$format = 'Y-m-d H:i:s';
$now = new DateTime();
$utcTime = $now->setTimeZone($utc)->format($format); // to database
echo 'default time: '.$now->format($format).'<br>';
echo 'Amsterdam time: '.$now->setTimeZone($amsterdam)->format($format).'<br>';
echo 'PDT time: '.$now->setTimeZone($pdt)->format($format).'<br>';
echo 'UTC time: '.$utcTime.'<br>';
// from database
$dbTime = new DateTime($utcTime, $utc);
echo 'time from database converted to local time: '.$dbTime->setTimeZone($amsterdam)->format($format).'<br>';
?>
echo 'default timezone: '.date_default_timezone_get().'<br>'; // levert bijvoorbeed Europe/Berlin
$pdt = new DateTimeZone('America/Los_Angeles');
$amsterdam = new DateTimeZone('Europe/Amsterdam');
$utc = new DateTimeZone('UTC'); // DateTimeZone::UTC does not work?
$format = 'Y-m-d H:i:s';
$now = new DateTime();
$utcTime = $now->setTimeZone($utc)->format($format); // to database
echo 'default time: '.$now->format($format).'<br>';
echo 'Amsterdam time: '.$now->setTimeZone($amsterdam)->format($format).'<br>';
echo 'PDT time: '.$now->setTimeZone($pdt)->format($format).'<br>';
echo 'UTC time: '.$utcTime.'<br>';
// from database
$dbTime = new DateTime($utcTime, $utc);
echo 'time from database converted to local time: '.$dbTime->setTimeZone($amsterdam)->format($format).'<br>';
?>
En dit doe je dus allemaal met een en dezelfde timestamp ($now).
Op het moment dat je datums en tijden weergeeft zou je die dus eerst door een functie/methode heen kunnen (en dus eigenlijk moeten) halen waarin de relevante tijdszone wordt ingesteld en verdere formatteringslogica wordt afgehandeld. Op die manier zouden gebruikers in een systeem dus alle datums en tijden in hun eigen lokale tijd(szone) kunnen zien.
Omdat de tijden allemaal in UTC zijn opgeslagen is er relatief gezien geen verschil, m.a.w. als iemand een kwartier geleden in Amsterdam een bericht plaatst op dit forum (alhoewel, misschien niet op dit formum omdat de tijden hier nog steeds vertiefd zijn :p) en iemand aan de andere kant van de wereld (die in zijn/haar profiel de daar geldende lokale tijdszone heeft ingesteld) kan dan dus zien dat het bericht voor hem/haar een kwartier geleden was geplaatst, onafhankelijk waar je je ter wereld bevindt of welke lokale tijdszone je gebruikt.
Aan (sec) een timestamp/datetime zelf kun je hierover geen enkele informatie afleiden.
Het kan natuurlijk ook gewoon zo zijn dat de klok van je webserver de verkeerde tijd aangeeft, in absolute zin.
Gewijzigd op 12/06/2019 15:54:12 door Thomas van den Heuvel
Dank je voor de uitgebreide uitleg. Hier kan ik verder mee.