調査のきっかけ
EmbulkでMySQLからDatetimeやTimestampを取得すると、DBが日本時間(+900)なのにEmbulkではUTC(+000)となる。
このUTC変換は、どの場所のタイムゾーンを使って変換しているのかわからなかったので調べてみた。
MySQLの調査データ
JSTの場合
mysql> desc dt;
+-------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| d | datetime | YES | | NULL | |
| t | timestamp | YES | | NULL | |
+-------+-----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | JST |
| time_zone | SYSTEM | <-- SYSTEMはsystem_time_zoneの設定に倣うという意味
+------------------+--------+
mysql> select * from dt;
+---------------------+---------------------+
| d | t |
+---------------------+---------------------+
| 2019-03-25 13:14:00 | 2019-03-25 13:14:00 |
+---------------------+---------------------+
UTCの場合
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | UTC |
| time_zone | SYSTEM | <-- SYSTEMはsystem_time_zoneの設定に倣うという意味
+------------------+--------+
mysql> select * from dt;
+---------------------+---------------------+
| d | t |
+---------------------+---------------------+
| 2019-03-25 13:14:00 | 2019-03-25 04:14:00 |
+---------------------+---------------------+
Embulkのバージョンとyml
root@9d86773c89eb:/home/embulk# embulk --help
Embulk v0.9.16
in:
type: mysql
host: mysql_host
user: root
password: pass
database: embulk
# 今はTZが未設定。下記をそれぞれ有効化して変化を調べる
# options: {useLegacyDatetimeCode: false, serverTimezone: Etc/UTC}
# options: {useLegacyDatetimeCode: false, serverTimezone: Asia/Tokyo}
query: "select d, t from dt"
一覧
DBサーバ | Embulkサーバ | Embulk設定 | DB:datetime | DB:timestamp | Embulk:datetime | Embulk:timestamp | 時間差 | メモ |
---|---|---|---|---|---|---|---|---|
UTC | UTC | 未指定 | 2019/3/25 13:14 | 2019/3/25 4:14 | 2019-03-25 13:14:00 UTC | 2019-03-25 04:14:00 UTC | 時間そのまま | |
UTC | UTC | Asia/Tokyo | 2019/3/25 13:14 | 2019/3/25 4:14 | 2019-03-25 04:14:00 UTC | 2019-03-24 19:14:00 UTC | -9時間 | Embulkの設定が利いてる |
UTC | Asia/Tokyo | 未指定 | 2019/3/25 13:14 | 2019/3/25 4:14 | 2019-03-25 13:14:00 UTC | 2019-03-25 04:14:00 UTC | 時間そのまま | Embulkサーバーのタイムゾーンは無視してる |
UTC | Asia/Tokyo | Asia/Tokyo | 2019/3/25 13:14 | 2019/3/25 4:14 | 2019-03-25 04:14:00 UTC | 2019-03-24 19:14:00 UTC | -9時間 | |
JST | UTC | 未指定 | 2019/3/25 13:14 | 2019/3/25 13:14 | 2019-03-25 04:14:00 UTC | 2019-03-25 04:14:00 UTC | -9時間 | DBのタイムゾーンが利いてる |
JST | UTC | Asia/Tokyo | 2019/3/25 13:14 | 2019/3/25 13:14 | 2019-03-25 04:14:00 UTC | 2019-03-25 04:14:00 UTC | -9時間 | |
JST | Asia/Tokyo | 未指定 | 2019/3/25 13:14 | 2019/3/25 13:14 | 2019-03-25 04:14:00 UTC | 2019-03-25 04:14:00 UTC | -9時間 | |
JST | Asia/Tokyo | Asia/Tokyo | 2019/3/25 13:14 | 2019/3/25 13:14 | 2019-03-25 04:14:00 UTC | 2019-03-25 04:14:00 UTC | -9時間 | |
JST | UTC | UTC | 2019/3/25 13:14 | 2019/3/25 13:14 | 2019-03-25 13:14:00 UTC | 2019-03-25 13:14:00 UTC | 時間そのまま | Embulkの設定でDBのタイムゾーンを上書きしてる |
JST | Asia/Tokyo | UTC | 2019/3/25 13:14 | 2019/3/25 13:14 | 2019-03-25 13:14:00 UTC | 2019-03-25 13:14:00 UTC | 時間そのまま |
まとめ
MySQLが採用しているタイムゾーンを使ってUTC化している。
しかしEmbulk側のserverTimezone
でタイムゾーンの上書きができる。