我在Ecto变更集中的某些记录上设置了时间戳(例如,当记录进入不同的状态,发送消息时等等)
现在我有两种方法可以做到这一点。使用当地时间或UTC。例如:
def changeset_utc(struct, params \\ %{}) do
struct
|> cast(params, [:from, :to, :sent_at, :subject, :content])
|> set_sent_at_utc
end
def changeset_local(struct, params \\ %{}) do
struct
|> cast(params, [:from, :to, :sent_at, :subject, :content])
|> set_sent_at_local
end
defp set_sent_at_local(changeset) do
datetime = :calendar.universal_time() |> :calendar.universal_time_to_local_time() |> Ecto.DateTime.from_erl
put_change(changeset, :sent_at, datetime)
end
defp set_sent_at_utc(changeset) do
datetime = :calendar.universal_time() |> Ecto.DateTime.from_erl
put_change(changeset, :sent_at, datetime)
end
因此,根据我的理解,最好以UTC格式存储时间。如果我将时间存储为当地时间,一旦我必须处理不同的时区,事情就会变得非常混乱。
但我想知道:有没有更好的方法来解决这个问题?有没有办法用时区存储DateTime?