Elixir 将时区数据添加到天真的日期时间

Elixir add timezone data to naive date time

我有一个 NaiveDateTime 需要添加时区数据。例如,如果我有一个像 ~N[2015-10-03 12:00:00.000000] 这样的 naive_date 值,我想将它设置为 "America/Los_Angeles" 时区,这在 Elixir 中怎么可能?

根据 NaiveDateTime 文档:

We call them "naive" because this datetime representation does not have a time zone.

这意味着 您不能将时区数据添加到 NaiveDateTime 对象


但是 您可以将 NaiveDateTime 转换为 DateTime 可以保存时区数据 DateTime.from_naive!/2:

DateTime.from_naive!(~N[2015-10-03 12:00:00.000000], "Etc/UTC")

使用 Timex 软件包,可以:

更新:更好的解决方案

iex> use timex

iex> naive_date = ~N[2015-10-03 12:00:00.000000]

iex> Timex.to_datetime(naive_date, "America/Los_Angeles")
#DateTime<2015-10-03 12:00:00-07:00 PDT America/Los_Angeles>

旧解

use timex

utc_time = DateTime.from_naive!(~N[2015-10-03 12:00:00.000000], "Etc/UTC")

tz_offset =
  Timex.timezone("America/Los_Angeles", utc_time)
  |> Timex.Timezone.total_offset()

Timex.shift(utc_time, seconds: -tz_offset)
  |> Timezone.convert("America/Los_Angeles")