这似乎是一个非常愚蠢的问题,但是如何在Elixir中获取并显示当前日期或时间呢?我尝试浏览文档,但找不到任何东西。我需要使用Erlang函数吗?
Answers:
您可以DateTime.utc_now/0
用来获取UTC日期时间。
从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
如果您不在乎时区,而只希望使用纯日期和时间,请使用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结构中获取特定的日期和时间值。
我认为您最好的选择是为Elixir使用Paul Schoenfelder(又名BitWalker)的timex库。库在这里:https : //github.com/bitwalker/timex,您可以从hex.pm https://hex.pm/packages/timex获取软件包。Paul在该github存储库的自述文件页面上很好地解释了如何使用该库。
您可以调用本地的Erlang库,但我认为当与Elixir打交道时,Paul的库更为出色。
这取决于您想要的格式。
您可以使用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保证返回值将增加每次调用。如果在计算机上的紧密循环中调用它的速度足够快以至于每微秒调用一次,则返回的时间戳将超过实时。
替代的是具有更高精度和控制力的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还拥有自己的用于处理日期和时间的模块套件:Date
和DateTime
。您可以使用其功能来获取当前日期或时间,如下所示:
iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>
您还可以使用从UTC:os.timestamp\0
返回的{megaseconds, seconds, microseconds}
。:os.timestamp |> :calendar.now_to_datetime
现在将以erlang标准{{YYYY, MM, DD}, {HH, MM, SS}}
格式提供给您。