embulk-input-mysqlの時刻ずれまとめ

# 調査のきっかけ

EmbulkでMySQLからDatetimeやTimestampを取得すると、DBが日本時間(+900)なのにEmbulkではUTC(+000)となる。
このUTC変換は、どの場所のタイムゾーンを使って変換しているのかわからなかったので調べてみた。

# MySQLの調査データ

```text: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 |
+---------------------+---------------------+
```

```text: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

```bash
root@9d86773c89eb:/home/embulk# embulk --help
Embulk v0.9.16
```

```yml
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|時間そのまま|　|

※追記 上の表は改行が入って見ずらいので画像化
![image.png](https://qiita-image-store.s3.amazonaws.com/0/11203/fba7d651-efa1-0589-f5b1-a4a0518a3a4e.png)

# まとめ

MySQLが採用しているタイムゾーンを使ってUTC化している。
しかしEmbulk側の`serverTimezone`でタイムゾーンの上書きができる。