今回は、時間の設定でハマりやすい点について解説していきます。
僕自身、久々に環境構築すると忘れるため備忘録として残しておきます。
▼この記事では、以下の点を理解できます。
- Mysqlの設定の確認
- Ruby on Railsの設定の確認
- timezoneを日本時間にする方法
この後、上記の順で紹介していきたいと思います。timezoneが日本時間にならないという方は確認してみてください。
Mysqlに登録したデータの時間が日本時間にならない原因
Railsアプリでデータを登録したときに、9時間ずれている問題はだいたい以下の2箇所のどちらかが原因なので、調べて修正すると日本時間になると思います。
- Mysqlの設定
- Railsの設定
順番に確認していきたいと思います。
実行環境
▼このような環境で変更、確認をしています。
- macOS Big Sur(11.6)
- Docker version 20.10.7
- mysql8.0
- rails6系
DockerのMysqlのtimezoneを確認設定する
DockerのMysqlを利用する場合に、どのような設定になっているのか確認してみます。
Mysqlにログインして設定を確認する
Mysqlの設定を確認するために、Dockerに入り、Mysqlにログインして確認していくため、以下の手順で進めていきます。
Dockerでコンテナ名を確認する
docker-compose psコマンドでコンテナ一覧を表示し、mysqlのコンテナ名を利用ます。(僕の環境では、backend_db_1です。)
docker-compose ps Name ------------------------------------------------- backend_api_1 ... backend_db_1 ...
Dockerに入る
最初に以下のコマンドでdockerに入ります。「root@8e31...」みたいになっていると思います。
※当然ですが、docker-compose upで起動しておく必要があります。
docker exec -it backend_db_1 bash
Mysqlにログインする
次にMysqlにログインしていきます。Mysqlのログイン情報はconfig/database.ymlに書いてあると思います。
mysql -u root -p Enter password: ← ここにパスワードをセットしてEnter Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection... ... ... mysql>
Mysqlの設定を確認する
このようになっているとしっかり設定されているので、問題ないですね。
mysql>show variables like '%time_zone%'; +------------------+------------+ | Variable_name | Value | +------------------+------------+ | system_time_zone | JST | | time_zone | Asia/Tokyo | +------------------+------------+
試しにInset文を書いて実行してみて、現在時刻でInsertされているのであれば問題なしです。
mysql>Insert into myapp_development.sample_table (name, created_at, updated_at) values('サンプルレコード', NOW(), NOW());
Docker x Mysqlの設定を変える方法
設定確認するコマンドをたたいて、以下のような設定になっている場合は、timezoneをAsia/Tokyoにすることで解決します。
mysql>show variables like '%time_zone%'; +------------------+------------+ | Variable_name | Value | +------------------+------------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+------------+
timezoneをAsia/Tokyoにする
timezoneの設定は、docker-compose.ymlでできます。以下はサンプルのdocker-compose.ymlです。「command」の部分で設定しています。
version: "3" services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: password command: --default-time-zone=Asia/Tokyo --default-authentication-plugin=mysql_native_password volumes: - mysql-data:/var/lib/mysql - /tmp/dockerdir:/etc/mysql/conf.d/ ports: - 3306:3306
これでMysqlのtimezoneがAsia/Tokyoに変更されていると思うので、確認してみてください。
インサート文が現在時刻で登録・更新できることが確認できたけれど、Railsアプリから登録すると9時間ずれているという場合は、さらにRails側で設定が必要なので、次に進んでみてください。
Ruby on Railsの設定の確認・変更する
以下のような場合はRails側の設定に問題がありそうです。
- SQL文を書いてインサートした場合に現在時刻で登録される
- Railsアプリから登録すると時間がずれる
Dockerのコンソールに入る
次はRails側のコンテナ名(backend_api_1)で入る。
docker exec -it backend_api_1 bash rails c irb(main):001:0>
Railsから登録
nameのみを持ったテーブルに、以下のような感じでRailsコンソールから登録してみる。その結果を確認してみてください。
irb(main):001:0>sample = Sample.new() irb(main):001:0>sample.name = 'Railsから登録' irb(main):001:0>sample.created_at = Time.now irb(main):001:0>sample.updated_at = Time.now irb(main):001:0>sample.save!
Railsから登録して時間がずれていた場合に追記する
Railsのconfig/application.rbの設定を確認する
config.time_zone = 'Tokyo' config.active_record.default_timezone = :local
timezoneの修正
config.active_record.default_timezoneはDB書き込みの際にどちらの設定を優先するかの設定になります。
以下のようになっていると、Insertしたときに、時間のずれがなくなっていると思います。
irb(main):001:0>Time.zone #<ActiveSupport::TimeZone:0x000055de3090a358 @name="Tokyo", @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>, @utc_offset=nil>
【Docker x Ruby on Rails】timezoneを日本時間に設定まとめ
今回は、Docker x Railsでtimezoneの設定が漏れていて登録時間がずれてしまう点についての備忘録になります。
Dockerに入ってから設定の確認する方法や設定の変更などで詰まった人の参考になると幸いです。