【发布时间】:2015-04-20 02:31:42
【问题描述】:
这似乎是一个非常愚蠢的问题,但是如何在 Elixir 中获取和显示当前日期或时间?我尝试通过the docs,但找不到任何东西。我需要使用 Erlang 函数吗?
【问题讨论】:
标签: elixir
这似乎是一个非常愚蠢的问题,但是如何在 Elixir 中获取和显示当前日期或时间?我尝试通过the docs,但找不到任何东西。我需要使用 Erlang 函数吗?
【问题讨论】:
标签: elixir
如果您不关心时区而只想要纯日期和时间,请使用NaiveDateTime:
NaiveDateTime.utc_now
# => ~N[2017-11-30 20:49:54.660724]
如果您还需要时区详细信息,请使用DateTime,它还会返回时区名称、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/1 和 to_time/1,以从 datetime 结构中获取特定的日期和时间值。
【讨论】:
嗯,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"
【讨论】:
这取决于你想要的格式。
您可以使用 Elixir 的 Erlang 标准库中的任何函数。传统上,您可以使用now/0 函数来获得时间:
iex(1)> :erlang.now
{1487, 549978, 29683}
表示time_t 1,487,549,978.29683,即 2017 年 2 月 20 日星期一午夜 UTC 后 19 分 38.29683 秒。
但是,从 Erlang/OTP 18 开始,该功能已被弃用;原因之一是 Erlang 保证每次调用都会增加返回值。如果在机器上以足够快的速度在紧密循环中调用它以每微秒多次调用它,则返回的时间戳将领先于实时。
替换为an API with more precision and control。这个新 API 的主要接口是 os:system_time/0 函数,它以系统定义的单位返回纪元时间:
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 原生的界面,请使用 calendar 模块,该模块将为您提供元组:
iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 19, 38}}
从 1.3 开始,Elixir 还拥有自己的一组用于操作日期和时间的模块:Date 和 DateTime。您可以使用它的函数来获取当前日期或时间,如下所示:
iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>
【讨论】:
获取毫秒数(Unix Timestamp):
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
【讨论】:
from_unix!/3 只是为了立即转换回 to_unix/1。 DateTime 文档甚至对此有一句话:hexdocs.pm/elixir/1.12/DateTime.html#to_unix/2
您可以使用DateTime.utc_now/0 获取UTC DateTime。
【讨论】:
获取unix时间戳
DateTime.to_unix(DateTime.utc_now)
【讨论】:
from_unix!/3 只是为了立即转换回to_unix/1。 DateTime 文档甚至对此有一句话:hexdocs.pm/elixir/1.12/DateTime.html#to_unix/2
从 Erlang 19.1 开始:
:os.system_time(:millisecond)
来自 Erlang 18:
:os.system_time(:milli_seconds)
给出当前的 UNIX 时间戳 UTC。
感谢@HenrikN 链接博文http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html
【讨论】:
如果您需要处理夏令时或时区,我为此创建了一个库:Calendar。
要获取当前时间,您可以使用 Calendar.DateTime.now("America/Los_Angeles") 获取洛杉矶的当前时间,或使用 Calendar.DateTime.now_utc 获取 UTC 的当前时间。
【讨论】:
您也可以使用:os.timestamp\0,它从UTC 返回{megaseconds, seconds, microseconds}。 :os.timestamp |> :calendar.now_to_datetime 现在将以 erlang 标准 {{YYYY, MM, DD}, {HH, MM, SS}} 格式为您提供。
【讨论】:
要更具体地回答您的问题(尽管我非常感谢 Onorio 建议使用 Timex!),您可以使用 :calendar.universal_time() 或 :calendar.local_time() 从 Erlang 标准库中获取当前日期和时间。 calendar 模块中有许多有用的函数可用于处理 Erlang 的 datetime 类型,但它们有些有限,并且不为您提供任何用于解析或格式化日期的功能,而这正是 Timex 的用武之地。
【讨论】:
DateTime.utc_now()。和Calendar.strftime/2 格式化它。
我认为最好的办法是使用 Paul Schoenfelder(又名 BitWalker)的 Elixir 时间库。库在这里:https://github.com/bitwalker/timex,您可以从 hex.pm https://hex.pm/packages/timex 获取包。 Paul 在该 github 存储库的自述页面上很好地解释了如何使用该库。
你可以调用原生 Erlang 库,但我认为 Paul 的库在处理 Elixir 时更胜一筹。
【讨论】: