希望在 Ecto 模式和迁移中使用
DateTime
,而不是默认的 NaiveDateTime
,也想在 PostgreSQL 中使用 timestamptz
,而不是默认的 timestamp
(又名。timestamp without time zone
)。
timestamptz
和 :utc_datetime
注意:Ecto.Migration.timestamps/1(source)全局配置始终可以在本地覆盖。
使用
:migration_timestamps
文档中的 Ecto.Migration
配置选项:
# in ./config/dev.exs (for example)
config :app, App.Repo, migration_timestamps: [type: :timestamptz]
并且可以像往常一样在迁移中使用
Ecto.Migration.timestamps/1
:
# ./priv/repo/migrations/20190718195828_create_users.exs
create table(:users) do
add :username, :string, null: false
timestamps()
end
Postgres
适配器将自动切换
Elixir 表示为 DateTime
从
NaiveDateTime
。
使用 Ecto.Migration.timestamps/1 的
:type
选项:
defmodule App.Repo.Migrations.CreateUsers do
use Ecto.Migration
def change do
create table(:users) do
add :username, :string, null: false
timestamps(type: :timestamptz)
end
end
end
:utc_datetime
Ecto 模式也需要修改为 使用
:utc_datetime
,否则他们会期望
默认为NaiveDateTime
。稍微修改一下
中的示例
Ecto.Schema
文档:
# Define a module to be used as base defmodule MyApp.Schema do defmacro __using__(_) do quote do use Ecto.Schema # In case one uses UUIDs @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id # ------------------------------------ @timestamps_opts [type: :utc_datetime] end end end # Now use MyApp.Schema to define new schemas defmodule MyApp.Comment do use MyApp.Schema schema "comments" do belongs_to :post, MyApp.Post timestamps() end end
defmodule ANV.Accounts.User do
use Ecto.Schema
# -- EITHER --------------------------
@timestamps_opts [type: :utc_datetime]
schema "users" do
field :username, :string
# -- OR -----------------------
timestamps(type: :utc_datetime)
end
DateTime
在 Elixir 中“仅处理“Etc/UTC”
datetimes”,但可以使用自定义配置
时区数据库,这就是 tzdata
图书馆是
PostgreSQL、Elixir 和 Phoenix 中的时区 以及 如何在 Ecto 中将时间戳设置为 UTC 日期时间
第一篇文章中的一个非常方便的表格:
+----------------------+------------------+------------------------+------------------------------+-----------------------------------+
| Ecto 3 type | Elixir type | Supports microseconds? | Supports DateTime functions? | Supports NaiveDateTime functions? |
+----------------------+------------------+------------------------+------------------------------+-----------------------------------+
| :utc_datetime_usec | DateTime | YES | YES | YES |
| :utc_datetime | DateTime | NO | YES | YES |
| :naive_datetime_usec | NaiveDateTime | YES | NO | YES |
| :naive_datetime | NaiveDateTime | NO | NO | YES |
+----------------------+------------------+------------------------+------------------------------+-----------------------------------+