質問編集履歴
3
試したことセクションに :calendar\.datetime_to_gregorian_seconds に関する記述を追記した
test
CHANGED
File without changes
|
test
CHANGED
@@ -146,6 +146,38 @@
|
|
146
146
|
|
147
147
|
|
148
148
|
|
149
|
+
__2017-06-04 13:00 追記__
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
@mhashi さんのコメントにもあるように、インサートの際に UTC で入れないとダメなようです。
|
154
|
+
|
155
|
+
そもそも PostgreSQL の timestamp with timezone はタイムスタンプを UTC で持っており、それを、必要に応じて変換してから出力しているみたいなので、そこに JST の日時を入れてしまうと二重に +9 されてしまうようです。
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
たどり着いたコードとしては、
|
160
|
+
|
161
|
+
`Ecto.Adapters.Postgres.Timestamp.encode/1` の中で
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
```elixir
|
166
|
+
|
167
|
+
:calendar.datetime_to_gregorian_seconds({{2017,6,4},{13,0,0}})
|
168
|
+
|
169
|
+
```
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
のようにして秒に変換しているのですが、当然ながらここではタイムゾーンは考慮されてないです。このタプルは、単純に Timex.Ecto.DateTimeWithTimezone の値 `{{{2017,6,4},{13,0,0}}, "Asia/Tokyo"}` のタイムスタンプ部分を取ってきているにすぎません。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
__2017-06-04 13:00 追記ここまで__
|
178
|
+
|
179
|
+
|
180
|
+
|
149
181
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
150
182
|
|
151
183
|
|
2
datetimetz 型をつくった旨を追記、どちらが正しい日時なのか明記
test
CHANGED
File without changes
|
test
CHANGED
@@ -28,7 +28,25 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
+
インタラクションに従って、データベースに datetimetz 型をつくって、Elixir からはTimex.Ecto.DateTimeWithTimezone 型の変数を入れられるようにしました。
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
```sql
|
36
|
+
|
37
|
+
CREATE TYPE datetimetz AS (
|
38
|
+
|
39
|
+
dt timestamptz,
|
40
|
+
|
41
|
+
tz varchar
|
42
|
+
|
43
|
+
);
|
44
|
+
|
45
|
+
```
|
46
|
+
|
47
|
+
|
48
|
+
|
31
|
-
Ecto.DateTimeWithTimezone な変数の中身をダンプすると以下のようになっています。
|
49
|
+
Timex.Ecto.DateTimeWithTimezone な変数の中身をダンプすると以下のようになっています。
|
32
50
|
|
33
51
|
|
34
52
|
|
@@ -54,7 +72,7 @@
|
|
54
72
|
|
55
73
|
|
56
74
|
|
57
|
-
9時間ずれている。。
|
75
|
+
9時間ずれている。。実際の時刻は上の方です(今日の午前11時に実行しました)。
|
58
76
|
|
59
77
|
|
60
78
|
|
1
初心者マークつけた
test
CHANGED
File without changes
|
test
CHANGED
File without changes
|