Elixir 将时区数据添加到朴素的日期时间

Mur*_*ago 6 datetime elixir datetime-conversion phoenix-framework

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

lar*_*ris 9

使用 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>
Run Code Online (Sandbox Code Playgroud)

旧解决方案

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")
Run Code Online (Sandbox Code Playgroud)

  • `Timex` 一开始就不是 Elixir 核心,你至少应该提一下,要让它工作,`timex` 包应该包含在 `deps` 列表中。 (5认同)

Ron*_*eau 6

根据NaiveDateTime文档:

我们称它们为“天真”,因为这种日期时间表示没有时区。

这意味着您不能将时区数据添加到NaiveDateTimeobject


但是你可以转换NaiveDateTimeDateTime可以与保持时间区域数据DateTime.from_naive!/2

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