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")
我有一个 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")