コンテキスト:MySQLバージョン
MySQL 5.7.17の場合(_SHOW VARIABLES LIKE "%version%";
_で示される)
コンテキスト:MySQLタイムゾーン設定
そして_SELECT @@global.time_zone, @@session.time_zone;
_で
_+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
_
...つまり、サーバーはシステムのタイムゾーンを追跡します。
コンテキスト:システムのタイムゾーン
これはLinuxであり、システムのタイムゾーンを次のようにチェックします(出力は編集済み)。
_$ timedatectl
Local time: Wed 2018-02-14 13:21:30 GMT
Universal time: Wed 2018-02-14 13:21:30 UTC
RTC time: Wed 2018-02-14 13:21:30
Time zone: Europe/London (GMT, +0000)
_
コンテキスト:知っていること
コンテキスト:現在の時刻
それは今です:
_$ date +"The current time is %s alias %c"
The current time is 1518617572 alias Wed 14 Feb 2018 14:12:52 GMT
_
問題
実行してみましょう:
_SELECT NOW(),FROM_UNIXTIME(0),UNIX_TIMESTAMP(),FROM_UNIXTIME(UNIX_TIMESTAMP());
_
出力(手でピボットするのが適切です。それを行うためのオプションがあるはずです):
_NOW() 2018-02-14 14:15:13 -- Display "now" in SYSTEM timetone: OK
FROM_UNIXTIME(0) 1970-01-01 01:00:00 -- Display 1970-01-01 00:00:00 in SYSTEM timetone: NOT OK
UNIX_TIMESTAMP() 1518617713 -- Correct unixtime
FROM_UNIXTIME(UNIX_TIMESTAMP()) 2018-02-14 14:15:13 -- Same as NOW(): OK
_
上記では、FROM_UNIXTIME(0)
が_1970-01-01 01:00:00
_を与えていることを除いて、すべて正常です。 Unix Time 0がUTCで表示された場合、_1970-01-01 00:00:00
_が表示されます(または表示されますか?)
これは、ローカルまたはリモートマシンから接続した場合に発生します。
念のため、DATETIMEに強制的にチェックしました。同じことが起こります:
_CREATE TEMPORARY TABLE test (N DATETIME, FUX DATETIME, UXT LONG, NN DATETIME);
INSERT INTO test SELECT NOW(),FROM_UNIXTIME(0),UNIX_TIMESTAMP(),FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT * FROM test;
+---------------------+---------------------+------------+---------------------+
| N | FUX | UXT | NN |
+---------------------+---------------------+------------+---------------------+
| 2018-02-14 14:19:51 | 1970-01-01 01:00:00 | 1518617991 | 2018-02-14 14:19:51 |
+---------------------+---------------------+------------+---------------------+
_
これは、セッションのタイムゾーンによって異なります。私はあなたと同じタイムゾーンにいます:
_$ timedatectl
Local time: Wed 2018-02-14 21:25:44 GMT
Universal time: Wed 2018-02-14 21:25:44 UTC
RTC time: Wed 2018-02-14 21:25:44
Time zone: Europe/London (GMT, +0000)
_
以下の結果はMariaDBからのものですが、MySQLでも同じだと思います。
_SET time_zone = 'SYSTEM';
SELECT FROM_UNIXTIME(0), NOW();
+---------------------+---------------------+
| FROM_UNIXTIME(0) | NOW() |
+---------------------+---------------------+
| 1970-01-01 01:00:00 | 2018-02-14 21:30:11 |
+---------------------+---------------------+
_
そして:
_SET time_zone = '+1:00';
SELECT FROM_UNIXTIME(0), NOW();
+---------------------+---------------------+
| FROM_UNIXTIME(0) | NOW() |
+---------------------+---------------------+
| 1970-01-01 01:00:00 | 2018-02-14 22:30:33 |
+---------------------+---------------------+
_
しかしながら:
_SET time_zone = '+0:00';
SELECT FROM_UNIXTIME(0), NOW();
+---------------------+---------------------+
| FROM_UNIXTIME(0) | NOW() |
+---------------------+---------------------+
| 1970-01-01 00:00:00 | 2018-02-14 21:34:41 |
+---------------------+---------------------+
_
Time_zoneの値SYSTEM
と_+0:00
_がFROM_UNIXTIME(0)
に異なる結果を与えることに驚いています。これはバグのように見えますが、理解できないことがあるかもしれません。
時刻0の「タイムゾーン:ヨーロッパ/ロンドン」はDSTでした(またはDSTではありませんか?)。あなたは現在DSTにいません(またはあなたはいますか?)。それはおそらく1時間の差異です。
ヨーロッパ/ロンドンはUTCと同じではありません。