マニュアルから(セクション9.6):
グローバルおよびクライアント固有のタイムゾーンの現在の値は、次のようにして取得できます。
mysql> SELECT @@global.time_zone, @@session.time_zone;
編集上記はSYSTEM
、MySQLがシステムのタイムゾーンのスレーブに設定されている場合に戻ります。これはあまり役に立ちません。あなたがPHPを使用しているので、MySQLのから答えがある場合、SYSTEM
あなたは、どのようなタイムゾーンシステムを求めることができ、それはだ経由で使用しますdate_default_timezone_get
。(もちろん、VolkerKが指摘したように、PHPは別のサーバーで実行されている可能性がありますが、想定されているように、それが通信しているWebサーバーとDBサーバーが [実際ではない場合]に設定されていると仮定すると、同じタイムゾーンは巨大な飛躍。)しかし、()MySQLのと同じように、あなたはPHPが使用するタイムゾーンを設定することができることを注意してください(date_default_timezone_set
)、つまり、OSが使用している値とは異なる値を報告する可能性があります。PHPコードを制御している場合は、それを行っているかどうかを知って大丈夫である必要があります。
しかし、MySQLサーバーがどのタイムゾーンを使用しているかという問題全体が正接である可能性があります。サーバーにどのタイムゾーンが使用されているかを尋ねると、データベース内のデータについてまったく何もわかりません。詳細については以下をお読みください:
さらなる議論:
サーバーを制御している場合は、もちろん、タイムゾーンが既知の量であることを確認できます。サーバーを制御できない場合は、接続で使用するタイムゾーンを次のように設定できます。
set time_zone = '+00:00';
これによりタイムゾーンがGMTに設定され、以降の操作(などnow()
)ではGMTが使用されます。
ただし、時刻と日付の値はタイムゾーン情報とともに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)
サーバーのタイムゾーンを知ることが、今の時間を取得する機能の面で重要なだけであるので、のようなnow()
、unix_timestamp()
等。データベースデータの日付が使用しているタイムゾーンについては何もわかりません。あなたはすることを選択するかもしれないと仮定し、彼らは、サーバーのタイムゾーンを使用して書かれていたが、その前提は十分に欠陥があることがあります。データに格納されている日付または時刻のタイムゾーンを知るには、それらがタイムゾーン情報とともに格納されていることを確認するか、(私がしているように)常にGMTであることを確認する必要があります。
サーバーのタイムゾーンを使用してデータが書き込まれたと想定されるのはなぜですか?1つには、データは異なるタイムゾーンを設定する接続を使用して書き込まれた可能性があります。データベースが1つのサーバーから別のサーバーに移動された可能性があります。サーバーは異なるタイムゾーンにあります(テキサスからカリフォルニアに移動したデータベースを継承したとき、私はそれに遭遇しました)。しかし、場合でも、データが現在のタイムゾーンで、サーバー上で書かれている、それはまだ曖昧です。昨年、米国では、11月1日の午前2時にサマータイムがオフになりました。サーバーがカリフォルニアの太平洋時間帯を使用していて、値が2009-11-01 01:30:00
データベース内。それはいつのことですか?11月1日の太平洋夏時間の午前1時30分、または11月1日の太平洋標準時の午前1時30分(1時間後)でしたか。あなたは知る方法が全くありません。道徳:日付/時刻は常にGMT(DSTを行わない)で保存し、必要に応じて、希望するタイムゾーンに変換します。