web-dev-qa-db-ja.com

MySQL:「FROM_UNIXTIME(0)」は「1970-01-01 01:00:00」を与え、これは1時間オフです

コンテキスト: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 |
+---------------------+---------------------+------------+---------------------+
_
3
David Tonhofer

これは、セッションのタイムゾーンによって異なります。私はあなたと同じタイムゾーンにいます:

_$ 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)に異なる結果を与えることに驚いています。これはバグのように見えますが、理解できないことがあるかもしれません。

1
dbdemon

時刻0の「タイムゾーン:ヨーロッパ/ロンドン」はDSTでした(またはDSTではありませんか?)。あなたは現在DSTにいません(またはあなたはいますか?)。それはおそらく1時間の差異です。

ヨーロッパ/ロンドンはUTCと同じではありません。

1
Rick James