【问题标题】:elixir UTC date time casting in ecto models and paramsecto 模型和参数中的 elixir UTC 日期时间转换
【发布时间】:2018-02-26 06:51:58
【问题描述】:

当我创建一个表时,我像这样定义我的表字段

add(:arrive_at, :utc_datetime)

在用于变更集

的模型中
attr(:arrive_at, :utc_datetime)

但是当我从任何设备发送带有时区的日期时间时,变更集将忽略时区信息,并且只转换日期时间部分,例如 2018-02-25 18:40:52.492657+03:00 将转换为 #DateTime。如何让正确的演员发挥作用

【问题讨论】:

  • 这很奇怪.. 如果你在iex -S mix:Ecto.Type.cast :utc_datetime, "2018-02-25 18:40:52.492657+03:00" 中运行它会得到什么。我得到{:ok, #DateTime<2018-02-25 15:40:52Z>}
  • @Dogbert 我得到了 {:ok, #DateTime} drive.google.com/file/d/1FXi_vXehH1TzzUCyTb2z7lRyqE84eiYI/…
  • Erlang/OTP 20 和 elixir 版本 1.6.1(使用 OTP 20 编译)
  • 我想我找到了奇怪的行为原因,它的旧 ecto 版本 **"ecto": {:hex, :ecto, "2.1.6"**(从 mix.lock 文件复制)。我没有升级 ecto,因为如果我升级 ecto,它使用长整数作为主键,我必须更改许多触发器、函数等。但是如果有一种方法可以升级 ecto 并使用相同的整数键,那么一切都很好

标签: datetime casting elixir phoenix-framework ecto


【解决方案1】:

旧 ecto 版本中存在错误,或者在 ecto 2.1.6 中未处理此问题,具体不知道。但是我通过将 ecto 升级到最新版本并将 config :app, App.Repo, migration_primary_key: [type: :serial], 传递给我的数据库配置选项来修复它。 (因为在不设置主键类型的情况下升级会将所有整数序列键更新为大整数,我不得不以这种方式更新很多函数和触发器)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多