質問編集履歴

3

試したことセクションに :calendar\.datetime_to_gregorian_seconds に関する記述を追記した

2017/06/04 04:16

投稿

退会済みユーザー
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 型をつくった旨を追記、どちらが正しい日時なのか明記

2017/06/04 04:16

投稿

退会済みユーザー
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

初心者マークつけた

2017/06/02 06:37

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes