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


80

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

Answers:


54

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


1
很好的答案,谢谢你们,我一定会签出Timex的!
Graham Conzett



16

NaiveDateTime

如果您不在乎时区,而只希望使用纯日期和时间,请使用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/1to_time/1,以从datetime结构中获取特定的日期和时间值。


12

我认为您最好的选择是为Elixir使用Paul Schoenfelder(又名BitWalker)的timex库。库在这里:https : //github.com/bitwalker/timex,您可以从hex.pm https://hex.pm/packages/timex获取软件包。Paul在该github存储库的自述文件页面上很好地解释了如何使用该库。

您可以调用本地的Erlang库,但我认为当与Elixir打交道时,Paul的库更为出色。


5
感谢您的推荐Onorio!对于阅读此书的任何人,我都非常乐意提供帮助,以便我们可以使Timex成为Elixir中日期/时间的去库,并且也许有一天可以将其合并到Elixir标准库中(如果它可以达到标准)。如果您有兴趣提供帮助,请给我发消息或潜入GitHub上的问题跟踪器并发送一些请求请求!
bitwalker

1
@bitwalker是的,Erlang / Elixir对于日期/时间库有很多事情要做。我希望timex也可以合并到Elixir中:)
Tony Han

11

这取决于您想要的格式。

您可以使用Elixir的Erlang标准库中的任何函数。传统上,您会花时间使用以下now/0功能:

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

这表示time_t1,487,549,978.29683,这是2017年2月20日星期一午夜UTC之后的19分钟38.29683秒。

但是,从Erlang / OTP 18开始,该功能已被弃用。原因之一是Erlang保证返回值将增加每次调用。如果在计算机上的紧密循环中调用它的速度足够快以至于每微秒调用一次,则返回的时间戳将超过实时。

替代的是具有更高精度和控制力的API。该新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模块中提供

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

对于更友好但仍为Elixir本机的界面,请使用calendar模块,该模块将为您提供元组:

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

从1.3开始,Elixir还拥有自己的用于处理日期和时间的模块套件:DateDateTime。您可以使用其功能来获取当前日期或时间,如下所示:

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



6

如果您需要处理夏令时或时区,我为此专门制作了一个库:Calendar

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.