質問編集履歴
3
試したことセクションに :calendar\.datetime_to_gregorian_seconds に関する記述を追記した
title
CHANGED
File without changes
|
body
CHANGED
@@ -72,6 +72,22 @@
|
|
72
72
|
|
73
73
|
Ectoのコード読んだくらいです(でもよく分からなかった。。)
|
74
74
|
|
75
|
+
__2017-06-04 13:00 追記__
|
76
|
+
|
77
|
+
@mhashi さんのコメントにもあるように、インサートの際に UTC で入れないとダメなようです。
|
78
|
+
そもそも PostgreSQL の timestamp with timezone はタイムスタンプを UTC で持っており、それを、必要に応じて変換してから出力しているみたいなので、そこに JST の日時を入れてしまうと二重に +9 されてしまうようです。
|
79
|
+
|
80
|
+
たどり着いたコードとしては、
|
81
|
+
`Ecto.Adapters.Postgres.Timestamp.encode/1` の中で
|
82
|
+
|
83
|
+
```elixir
|
84
|
+
:calendar.datetime_to_gregorian_seconds({{2017,6,4},{13,0,0}})
|
85
|
+
```
|
86
|
+
|
87
|
+
のようにして秒に変換しているのですが、当然ながらここではタイムゾーンは考慮されてないです。このタプルは、単純に Timex.Ecto.DateTimeWithTimezone の値 `{{{2017,6,4},{13,0,0}}, "Asia/Tokyo"}` のタイムスタンプ部分を取ってきているにすぎません。
|
88
|
+
|
89
|
+
__2017-06-04 13:00 追記ここまで__
|
90
|
+
|
75
91
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
76
92
|
|
77
93
|
Elixir 1.4
|
2
datetimetz 型をつくった旨を追記、どちらが正しい日時なのか明記
title
CHANGED
File without changes
|
body
CHANGED
@@ -13,8 +13,17 @@
|
|
13
13
|
|
14
14
|
###発生している問題・エラーメッセージ
|
15
15
|
|
16
|
-
Ecto.DateTimeWithTimezone
|
16
|
+
インタラクションに従って、データベースに datetimetz 型をつくって、Elixir からはTimex.Ecto.DateTimeWithTimezone 型の変数を入れられるようにしました。
|
17
17
|
|
18
|
+
```sql
|
19
|
+
CREATE TYPE datetimetz AS (
|
20
|
+
dt timestamptz,
|
21
|
+
tz varchar
|
22
|
+
);
|
23
|
+
```
|
24
|
+
|
25
|
+
Timex.Ecto.DateTimeWithTimezone な変数の中身をダンプすると以下のようになっています。
|
26
|
+
|
18
27
|
```elixir
|
19
28
|
IO.inspect model.inserted_at
|
20
29
|
# {{{2017, 6, 2}, {11, 41, 57, 93698}}, "Asia/Tokyo"}
|
@@ -26,7 +35,7 @@
|
|
26
35
|
("2017-06-02 20:41:57.093698+09",Asia/Tokyo)
|
27
36
|
```
|
28
37
|
|
29
|
-
9時間ずれている。。
|
38
|
+
9時間ずれている。。実際の時刻は上の方です(今日の午前11時に実行しました)。
|
30
39
|
|
31
40
|
###該当のソースコード
|
32
41
|
|
1
初心者マークつけた
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|