在 Elixir 中获取当前日期和/或时间

Getting the current date and or time in Elixir

这似乎是一个非常愚蠢的问题,但是如何在 Elixir 中获取和显示当前日期或时间?我尝试浏览 the docs 但找不到任何内容。我需要使用 Erlang 函数吗?

我认为最好的办法是使用 Paul Schoenfelder(又名 BitWalker)的 Elixir timex 库。库在这里:https://github.com/bitwalker/timex and you can get the package from hex.pm https://hex.pm/packages/timex。 Paul 在 github 存储库的自述文件页面上很好地解释了如何使用该库。

您可以调用本地 Erlang 库,但我认为 Paul 的库在处理 Elixir 时更胜一筹。

为了更具体地回答您的问题(尽管我非常感谢 Onorio 推荐使用 Timex!),您可以使用 :calendar.universal_time():calendar.local_time() 从 Erlang 标准库中获取当前日期和时间。在 calendar 模块中有许多用于处理 Erlang 的 datetime 类型的有用函数,但它们有些受限,并且不为您提供任何用于解析或格式化日期的功能,而 Timex进来了。

您也可以使用 :os.timestamp[=10=],其中 returns {megaseconds, seconds, microseconds} 来自 UTC。 :os.timestamp |> :calendar.now_to_datetime 现在将以 erlang 标准 {{YYYY, MM, DD}, {HH, MM, SS}} 格式为您提供。

如果您需要处理夏令时或时区,我为此创建了一个库:Calendar

要获取当前时间,您可以使用 Calendar.DateTime.now("America/Los_Angeles") 表示洛杉矶的当前时间或 Calendar.DateTime.now_utc 表示当前的 UTC 时间。

来自 Erlang 19.1:

:os.system_time(:millisecond)

来自 Erlang 18:

:os.system_time(:milli_seconds)

给出当前的 UNIX 时间戳 UTC。

感谢@HenrikN 链接博客 post http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html

您可以使用 DateTime.utc_now/0 获取 UTC 日期时间。

NaiveDateTime

如果您不关心时区而只想要纯日期和时间,请使用 NaiveDateTime:

NaiveDateTime.utc_now
# => ~N[2017-11-30 20:49:54.660724]

日期时间

如果您还需要时区详细信息,请使用 DateTime,这也会 return 时区名称、UTC 偏移量、STD 偏移量和时区缩写等信息:

DateTime.utc_now
# => %DateTime{calendar: Calendar.ISO, day: 30, hour: 20, microsecond: {667345, 6}, minute: 51, month: 11, second: 58, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC"}

您还可以从这些模块中调用 to_date/1to_time/1 以从日期时间结构中获取特定的日期和时间值。

这取决于您想要的格式。

您可以使用 Elixir 的 Erlang 标准库中的任何函数。传统上,您可以使用 now/0 函数获取时间:

iex(1)> :erlang.now
{1487, 549978, 29683}

表示time_t 1,487,549,978.29683,即UTC时间2017年2月20日星期一午夜后19分38.29683秒。

但是,自 Erlang/OTP 18 起,该功能已被弃用;原因之一是 Erlang 保证 return 值会在每次调用时增加。如果在机器上以足够快的速度在紧密循环中调用它以每微秒调用它多次,returned 时间戳将领先于实时。

替换为an API with more precision and control. The primary interface to this new API is the os:system_time/0函数,returns纪元时间system-defined单位:

iex(2)> :os.system_time
1487549978296838000

您可以使用 system_time/1 请求特定单位,但是:

iex(3)> :os.system_time(:millisecond)
1487549978296

从 Elixir 1.2 开始,这些功能在原生中也可用 System module:

iex(4)> System.system_time(:second)
1487549978

要获得更友好但仍然 Elixir-native 的界面,请使用 calendar 模块,它将为您提供元组:

iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 19, 38}}

从 1.3 开始,Elixir 也有自己的一套模块来处理日期和时间:Date and DateTime。您可以像这样使用它的函数来获取当前日期或时间:

iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>

获取unix时间戳

DateTime.to_unix(DateTime.utc_now)

获取毫秒数(Unix时间戳):

DateTime.utc_now() |> DateTime.to_unix(:millisecond)

好吧,Timex 通常可以解决问题,但是下面的一些技巧可能会有所帮助:

{erl_date, erl_time} = :calendar.local_time()
# {{2020, 11, 19}, {0, 6, 36}}

{:ok, time} = Time.from_erl(erl_time)
# {:ok, ~T[00:06:36]}

{:ok, date} = Date.from_erl(erl_date)
# {:ok, ~D[2020-11-19]}

Calendar.strftime(time, "%c", preferred_datetime: "%H:%M:%S")
# "00:06:36"


Calendar.strftime(date, "%c", preferred_datetime: "%m-%d-%Y")
# "11-19-2020"