設定
config/application.rb
class Application < Rails::Application
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local
end
参考: Rails 4 でTimeZoneにちょっとはまった
Timeオブジェクト
どれを使えば良いのか、全然わかってない。
とりあえず、Time.nowかTime.currentを使おうと思う。
pry(main)> Time.now
=> 2017-06-19 20:50:54 +0900
pry(main)> Time.now.class
=> Time
pry(main)> Time.current
=> Mon, 19 Jun 2017 20:51:22 JST +09:00
pry(main)> Time.current.class
=> ActiveSupport::TimeWithZone
pry(main)> Date.today
=> Mon, 19 Jun 2017
pry(main)> Date.today.class
=> Date
pry(main)> DateTime.now
=> Mon, 19 Jun 2017 20:54:23 +0900
pry(main)> DateTime.now.class
=> DateTime
pry(main)> DateTime.current
=> Mon, 19 Jun 2017 20:54:37 +0900
pry(main)> DateTime.current.class
=> DateTime
MySQLとActiveRecord
MySQL
mysql> SHOW VARIABLES LIKE '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | JST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2017-06-19 20:48:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM users WHERE id = 1\G
*************************** 1. row ***************************
id: 1
email: admin@example.com
name: 管理者
encrypted_password:
password_updated_at: NULL
reset_password_token: NULL
reset_password_sent_at: NULL
remember_created_at: NULL
sign_in_count: 1
current_sign_in_at: NULL
last_sign_in_at: NULL
current_sign_in_ip: 192.168.33.1
last_sign_in_ip: 192.168.33.1
failed_attempts: 0
unlock_token: NULL
locked_at: NULL
created_user_id: 1
updated_user_id: 1
created_at: 2017-06-19 14:51:23
updated_at: 2017-06-19 14:51:23
deleted_at: NULL
1 row in set (0.00 sec)
上記のusersデータは、日本時間で、14:51:23に登録したものです。
pry(main)> User.find(1).created_at
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> Mon, 19 Jun 2017 14:51:23 JST +09:00
pry(main)> User.where('created_at >= ?', Time.now).first
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE (created_at >= '2017-06-19 21:03:23.052284') ORDER BY `users`.`id` ASC LIMIT 1
=> nil
pry(main)> User.where('created_at >= ?', Time.now - 12.hours).first
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE (created_at >= '2017-06-19 09:03:51.739876') ORDER BY `users`.`id` ASC LIMIT 1
=> #<User id: 1, email: "admin@example.com", name: "管理者", password_updated_at: nil, role: 1, created_user_id: 1, updated_user_id: 1, created_at: "2017-06-19 05:51:23", updated_at: "2017-06-19 05:51:23", deleted_at: nil>