マニュアルから(セクション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つのサーバーから別のサーバーに移動された可能性があり、サーバーは異なるタイムゾーンにありました(テキサスからカリフォルニアに移動したデータベースを継承したときに遭遇しました)。ただし、たとえ データはサーバーに書き込まれ、現在のタイムゾーンではまだあいまいです。昨年、米国では、夏時間が11月1日の午前2時にオフになりました。サーバーが太平洋のタイムゾーンを使用してカリフォルニアにあり、値が2009-11-01 01:30:00
であるとします。 データベース内。それはいつのことですか?それは11月1日午前1時30分PDTでしたか、それとも11月1日午前1時30分PST(1時間後)でしたか?あなたには絶対に知る方法がありません。道徳:日付/時刻は常にGMTで保存し(DSTは実行しません)、必要に応じて/必要に応じて目的のタイムゾーンに変換します。