概要
Railsでモデルのデータをデータベースに保存した時、OSやMySQLのタイムゾーンはJSTなのに、created_at
やupdated_at
の時刻がUSTで保存されているのに気付いた。
以下の2つの方法があるようだ。
- データベースへの登録時刻をJSTにする方法
- データベースへの時刻登録はUSTとし、表示をJSTにする方法
日本以外でも利用するデータベースの時刻を統一するにはUSTの方がよさそうなので、ここでは2つ目の方法を用いた。
- プロジェクトのconf/application.rbに1行追加
- config.time_zone = ‘Tokyo’
- サーバーが実行中の場合は再起動
これでデータベース上はUST、Railsでの扱いはJSTになる。
データベースへの記録はUST
文字列フィールドを1つ持つテスト用のモデルを生成・マイグレートする。
この操作は21時過ぎに実行したが、マイグレーションファイルの時刻が12時台で、9時間遅れているのでUSTとわかる。
なお。CentOSとMySQLのタイムゾーンはTokyoに設定されている。
1 2 3 4 5 6 7 8 9 10 11 12 |
Running via Spring preloader in process 26713 invoke active_record create db/migrate/20210308121236_create_records.rb create app/models/record.rb invoke test_unit create test/models/record_test.rb create test/fixtures/records.yml [vagrant@localhost demo_app]$ rails db:migrate == 20210308121236 CreateRecords: migrating ==================================== -- create_table(:records) -> 0.0237s == 20210308121236 CreateRecords: migrated (0.0238s) =========================== |
mysqlにテーブルが作られている。
1 2 3 4 5 6 7 8 9 |
mysql> show tables; +-----------------------+ | Tables_in_demo_app_db | +-----------------------+ | ar_internal_metadata | | records | | schema_migrations | +-----------------------+ 3 rows in set (0.00 sec) |
コントローラーを編集して、トップページ表示時にレコードを保存し、改めて読み込んで表示させる。
1 2 3 4 5 6 7 8 9 |
class DemoContentsController < ApplicationController def top_page record = Record.new({col1: 'abc'}) record.save record = Record.find_by(col1: 'abc') puts "READ" p record end end |
データベースへの書き込み時と読み込み時の時刻がUSTになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Started GET "/" for 10.0.2.2 at 2021-03-08 21:17:04 +0900 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.0/127.255.255.255, ::1 (1.9ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC Processing by DemoContentsController#top_page as HTML TRANSACTION (1.4ms) BEGIN ↳ app/controllers/demo_contents_controller.rb:4:in `top_page' Record Create (1.6ms) INSERT INTO `records` (`col1`, `created_at`, `updated_at`) VALUES ('abc', '2021-03-08 12:17:04.394262', '2021-03-08 12:17:04.394262') ↳ app/controllers/demo_contents_controller.rb:4:in `top_page' TRANSACTION (3.4ms) COMMIT ↳ app/controllers/demo_contents_controller.rb:4:in `top_page' Record Load (2.3ms) SELECT `records`.* FROM `records` WHERE `records`.`col1` = 'abc' LIMIT 1 ↳ app/controllers/demo_contents_controller.rb:5:in `top_page' READ #<Record id: 1, col1: "abc", created_at: "2021-03-08 12:17:04.394262000 +0000", updated_at: "2021-03-08 12:17:04.394262000 +0000"> Rendering layout layouts/application.html.erb Rendering demo_contents/top_page.html.erb within layouts/application Rendered demo_contents/top_page.html.erb within layouts/application (Duration: 1.8ms | Allocations: 705) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 16.2ms | Allocations: 6563) Completed 200 OK in 79ms (Views: 20.0ms | ActiveRecord: 13.7ms | Allocations: 16960) |
mysqlで登録されたレコードを確認すると、USTで保存されている。
1 2 3 4 5 6 7 |
mysql> SELECT * FROM records; +----+------+----------------------------+----------------------------+ | id | col1 | created_at | updated_at | +----+------+----------------------------+----------------------------+ | 1 | abc | 2021-03-08 12:17:04.394262 | 2021-03-08 12:17:04.394262 | +----+------+----------------------------+----------------------------+ 1 row in set (0.00 sec) |
application.rbでタイムゾーンを設定
プロジェクトのconfig/aplication.rbに以下の1行を追加。
1 |
config.time_zone = 'Tokyo' |
Railsサーバーを立ち上げなおして実行すると、表示がJSTになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Started GET "/" for 10.0.2.2 at 2021-03-08 21:27:43 +0900 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.0/127.255.255.255, ::1 (1.7ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC Processing by DemoContentsController#top_page as HTML Record Load (2.3ms) SELECT `records`.* FROM `records` WHERE `records`.`col1` = 'abc' LIMIT 1 ↳ app/controllers/demo_contents_controller.rb:5:in `top_page' READ #<Record id: 1, col1: "abc", created_at: "2021-03-08 21:17:04.394262000 +0900", updated_at: "2021-03-08 21:17:04.394262000 +0900"> Rendering layout layouts/application.html.erb Rendering demo_contents/top_page.html.erb within layouts/application Rendered demo_contents/top_page.html.erb within layouts/application (Duration: 4.0ms | Allocations: 705) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 24.3ms | Allocations: 6563) Completed 200 OK in 96ms (Views: 31.1ms | ActiveRecord: 13.3ms | Allocations: 14376) |