当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir DateTime.from_naive用法及代码示例


Elixir语言中 DateTime.from_naive 相关用法介绍如下。

用法:

from_naive(naive_datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
(从 1.4.0 开始)
@spec from_naive(
  Calendar.naive_datetime(),
  Calendar.time_zone(),
  Calendar.time_zone_database()
) ::
  {:ok, t()}
  | {:ambiguous, first_datetime :: t(), second_datetime :: t()}
  | {:gap, t(), t()}
  | {:error,
     :incompatible_calendars
     | :time_zone_not_found
     | :utc_only_time_zone_database}

将给定的 NaiveDateTime 转换为 DateTime

它需要一个时区来放入 NaiveDateTime 。如果时区是"Etc/UTC",它总是成功的。否则,将根据 time_zone_database 给出的时区数据库检查 NaiveDateTime。请参阅模块文档中的“时区数据库”部分。

例子

iex> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, ~U[2016-05-24 13:26:08.003Z]}

当日期时间不明确时 - 例如在从夏季时间更改为冬季时间期间 - 两个可能的有效日期时间在一个元组中返回。第一个日期时间也是按时间顺序排在第一位的日期时间,而第二个日期时间排在最后。

iex> {:ambiguous, first_dt, second_dt} = DateTime.from_naive(~N[2018-10-28 02:30:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> first_dt
#DateTime<2018-10-28 02:30:00+02:00 CEST Europe/Copenhagen>
iex> second_dt
#DateTime<2018-10-28 02:30:00+01:00 CET Europe/Copenhagen>

当挂壁时间存在间隙时 - 例如在春天时钟向前转动时 - 间隙之前的最新有效日期时间和间隙之后的第一个有效日期时间。

iex> {:gap, just_before, just_after} = DateTime.from_naive(~N[2019-03-31 02:30:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> just_before
#DateTime<2019-03-31 01:59:59.999999+01:00 CET Europe/Copenhagen>
iex> just_after
#DateTime<2019-03-31 03:00:00+02:00 CEST Europe/Copenhagen>

大多数时候,在某个时区的某个日期和时间,只有一个有效的日期时间。

iex> {:ok, datetime} = DateTime.from_naive(~N[2018-07-28 12:30:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> datetime
#DateTime<2018-07-28 12:30:00+02:00 CEST Europe/Copenhagen>

此函数接受至少包含与 NaiveDateTime 结构相同的字段的任何映射或结构。最常见的例子是 DateTime 。在这种情况下,有关该 DateTime 的时区的信息将被完全忽略。这与将 DateTime 传递给 Date.to_iso8601/2 的原理相同。 Date.to_iso8601/2 仅提取给定结构的 date-specific 字段(日历、年、月和日)并忽略所有其他字段。

这样,如果您在一个时区有一个 DateTime ,您可以在另一个时区获得相同的挂钟时间。例如,如果您在哥本哈根有 2018-08-24 10:00:00 并且想要 UTC 的 2018-08-24 10:00:00 的 DateTime ,您可以执行以下操作:

iex> cph_datetime = DateTime.from_naive!(~N[2018-08-24 10:00:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> {:ok, utc_datetime} = DateTime.from_naive(cph_datetime, "Etc/UTC", FakeTimeZoneDatabase)
iex> utc_datetime
~U[2018-08-24 10:00:00Z]

相反,如果您想要在不同时区的同一时间点使用 DateTime ,请参阅 DateTime.shift_zone/3 函数,该函数会将哥本哈根的 2018-08-24 10:00:00 转换为 2018-08-24 08:00:00在UTC。

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 DateTime.from_naive(naive_datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。