teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

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

2017/06/04 04:16

投稿

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

2017/06/04 04:16

投稿

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

初心者マークつけた

2017/06/02 06:37

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
File without changes