Rails で t.datetime のカラムの初期化が地方時(LMT)になってしまう件

config.time_zone = 'Tokyo' migrate にて t.datetime と定義したカラムに対して Hoge.new(foo: DateTime.new(...)) で初期化すると地方時(LMT) で扱われてしまう件についてハマったので、奮闘の様子をまとめてみました。 続きを読む
0
サトウリョウスケ @ryosuke_sato

色々書いたので、一から問題点を整理すると、 Rails で config.time_zone = 'Tokyo' を指定した時に【日本標準時(+0900)】になってほしい。 でも実際は【地方時(+0918)】として扱われている。

2013-09-23 02:43:04
サトウリョウスケ @ryosuke_sato

DBに保存するときにUTC で保存するか JST で保存するかは config.active_record.default_timezone = (:utc | :local) で指定可能らしいですが、一旦置いておきます。

2013-09-23 02:46:59
サトウリョウスケ @ryosuke_sato

上手くいかないのは migrate で t.datetime と定義したカラムについてでして、h = Hoge.new(foo: Time.local(2013, 09, 23, 2, 40)) で生成した時、(続く)

2013-09-23 02:51:34
サトウリョウスケ @ryosuke_sato

(続き) p h.foo # => Mon, 23 Sep 2013 02:40:00 LMT +0918 ってなってしまうのです。 本当は、 p h.foo # => Mon, 23 Sep 2013 02:40:00 JST +0900 となってほしい。

2013-09-23 02:52:24
サトウリョウスケ @ryosuke_sato

LMT って何だ?ってなって調べたら天文学で使う地方平時というものらしい。東京だと地方平時は +0918 だって。僕は+0900 が欲しいんだ(^q^) http://t.co/MmQHHsZ2AJ

2013-09-22 22:32:52
サトウリョウスケ @ryosuke_sato

ちなみに、form から f.datetime_select 経由で入力した値を保存すると、 Mon, 23 Sep 2013 02:40:00 JST +0900 ってなります。

2013-09-23 02:54:13
サトウリョウスケ @ryosuke_sato

ちなみに、 h = Hoge.new(foo: DateTime.new(2013, 09, 23, 2, 40)) も試しましたが、ダメでした。

2013-09-23 02:56:21
サトウリョウスケ @ryosuke_sato

どうしても分からなかったので、結局 migrate で t.time で型定義したら上手くいった。ただし、config.active_record.default_timezone = :local をちゃんと指定する必要があるみたい。 #rails

2013-09-23 02:37:16