Uit de handleiding (sectie 9.6 ):
De huidige waarden van de globale en klantspecifieke tijdzones kunnen als volgt worden opgehaald:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Bewerken Het bovenstaande retourneert SYSTEM
als MySQL is ingesteld om de tijdzone van het systeem te gebruiken, wat niet zo handig is. Aangezien je PHP gebruikt, als het antwoord van MySQL SYSTEM
is , kunt u het systeem vervolgens vragen welke tijdzone het is gebruiken via date_default_timezone_get
. (Natuurlijk, zoals VolkerK al aangaf, draait PHP mogelijk op een andere server, maar als aannames gaan we ervan uit dat de webserver en de DB-server waarmee het praat ingesteld zijn op [indien niet echt in ] dezelfde tijdzone is niet enorm sprong.) Maar pas op dat (net als bij MySQL), u de tijdzone kunt instellen die PHP gebruikt (date_default_timezone_set
), wat betekent dat het een andere waarde kan rapporteren dan het besturingssysteem gebruikt. Als je de PHP-code onder controle hebt, zou je moeten weten of je dat doet en oké zijn.
Maar de hele vraag welke tijdzone de MySQL-server gebruikt, kan een raakvlak zijn, omdat de server vragen in welke tijdzone deze zich bevindt absoluut niets over de gegevens in de database. Lees verder voor details:
Verdere discussie :
Als u de server beheert, kunt u er natuurlijk voor zorgen dat de tijdzone een bekende hoeveelheid is. Als u geen controle heeft over de server, kunt u de tijdzone instellen die wordt gebruikt door uw verbinding zoals dit:
set time_zone = '+00:00';
Dat stelt de tijdzone in op GMT, zodat eventuele verdere bewerkingen (zoals now()
) gebruikt GMT.
Houd er echter rekening mee dat tijd- en datumwaarden niet zijn opgeslagen met tijdzone-informatie in MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Dus het kennen van de tijdzone van de server is alleen belangrijk in termen van functies die nu de tijd krijgen, zoals now()
, unix_timestamp()
, enzovoort.; het vertelt u niets over de tijdzone die de datums in de databasegegevens gebruiken. U kunt ervoor kiezen om aan te nemen ze zijn geschreven met behulp van de tijdzone van de server, maar die veronderstelling is mogelijk onjuist. Om de tijdzone te kennen van datums of tijden die in de gegevens zijn opgeslagen, moet je ervoor zorgen dat ze worden opgeslagen met tijdzone-informatie of (zoals ik doe) ervoor zorgen dat ze altijd in GMT zijn.
Waarom is de veronderstelling dat de gegevens zijn geschreven met behulp van de tijdzone van de server onjuist? Om te beginnen kunnen de gegevens zijn geschreven met een verbinding die een andere tijdzone instelt. De database is mogelijk verplaatst van de ene server naar de andere, waar de servers zich in verschillende tijdzones bevonden (ik kwam dat tegen toen ik een database erfde die van Texas naar Californië was verhuisd). Maar zelfs als de gegevens zijn op de server geschreven, met de huidige tijdzone is het nog steeds dubbelzinnig. Vorig jaar werd in de Verenigde Staten de zomertijd op 1 november om 02.00 uur uitgeschakeld. Stel dat mijn server zich in Californië bevindt en de Pacific-tijdzone gebruikt en ik heb de waarde 2009-11-01 01:30:00
in de databank. Wanneer was het? Was dat 01:30 uur op 1 november PDT of 01:30 uur op 1 november PST (een uur later)? Je kunt het absoluut niet weten. Moraal:sla datums/tijden altijd op in GMT (wat geen DST doet) en converteer naar de gewenste tijdzone als/wanneer dat nodig is.