Z příručky (část 9.6 ):
Aktuální hodnoty globálních časových pásem a časových pásem specifických pro klienta lze získat takto:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Upravit Výše uvedené vrátí SYSTEM
pokud je MySQL nastaveno na použití časového pásma systému, což je méně než užitečné. Vzhledem k tomu, že používáte PHP, je odpověď z MySQL SYSTEM
, můžete se pak systému zeptat, jaké časové pásmo je pomocí přes date_default_timezone_get
. (Samozřejmě, jak zdůraznil VolkerK, PHP může běžet na jiném serveru, ale podle předpokladů za předpokladu, že webový server a DB server, se kterým mluví, jsou nastaveny [pokud ve skutečnosti není v ] stejné časové pásmo není velké skok.) Ale pozor, (stejně jako u MySQL) můžete nastavit časové pásmo, které PHP používá (date_default_timezone_set
), což znamená, že může hlásit jinou hodnotu, než používá operační systém. Pokud ovládáte kód PHP, měli byste vědět, zda to děláte, a být v pořádku.
Ale celá otázka, jaké časové pásmo server MySQL používá, může být tečnou, protože dotaz na server, v jakém časovém pásmu se nachází, vám neřekne absolutně nic o údajích v databázi. Podrobnosti naleznete dále:
Další diskuse :
Pokud máte server pod kontrolou, můžete samozřejmě zajistit, aby časové pásmo bylo známé množství. Pokud nemáte kontrolu nad serverem, můžete nastavit časové pásmo používané vaším připojením takhle:
set time_zone = '+00:00';
Tím se časové pásmo nastaví na GMT, takže všechny další operace (jako now()
) bude používat GMT.
Upozorňujeme však, že hodnoty času a data nejsou uložené s informacemi o časovém pásmu v 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)
Znalost časového pásma serveru je tedy důležitá pouze z hlediska funkcí, které zjišťují čas právě teď, jako je now()
, unix_timestamp()
, atd.; neříká vám nic o tom, jaké časové pásmo data v databázových datech používají. Můžete se rozhodnout předpokládat byly napsány pomocí časového pásma serveru, ale tento předpoklad může být chybný. Chcete-li znát časové pásmo jakýchkoli dat nebo časů uložených v datech, musíte zajistit, aby byly uloženy s informacemi o časovém pásmu, nebo (jako já) zajistit, aby byly vždy v GMT.
Proč je předpoklad, že data byla zapsána pomocí časového pásma serveru, chybný? No, za prvé, data mohla být zapsána pomocí připojení, které nastavilo jiné časové pásmo. Databáze mohla být přesunuta z jednoho serveru na druhý, kde byly servery v různých časových pásmech (narazil jsem na to, když jsem zdědil databázi, která se přestěhovala z Texasu do Kalifornie). Ale i když data jsou zapsána na serveru, s aktuálním časovým pásmem je to stále nejednoznačné. Loni byl ve Spojených státech letní 1. listopadu ve 2:00 hodin vypnutý. Předpokládejme, že můj server je v Kalifornii a používá tichomořské časové pásmo a mám hodnotu 2009-11-01 01:30:00
v databázi. Kdy to bylo? Bylo to 1:30 1. listopadu PDT, nebo 1:30 1. listopadu PST (o hodinu později)? Absolutně to nemáš jak vědět. Morálka:Vždy ukládejte data/časy v GMT (který nedělá DST) a podle potřeby převeďte na požadované časové pásmo.