这似乎是一个非常愚蠢的问题,但是如何获得并显示Elixir中的当前日期或时间?我试过the docs但是找不到任何东西。我需要使用Erlang功能吗?
答案 0 :(得分:49)
更具体地回答您的问题(尽管我非常感谢Onorio建议使用Timex!),您可以使用:calendar.universal_time()
或{{1}从Erlang标准库获取当前日期和时间}。在:calendar.local_time()
模块中使用Erlang的datetime
类型有许多有用的功能,但它们有些限制,并且不提供任何用于解析或格式化的功能日期,这是Timex进来的地方。
答案 1 :(得分:43)
您可以使用DateTime.utc_now/0
获取UTC DateTime。
答案 2 :(得分:24)
来自Erlang 19.1:
Project.find({ where: {id: 1}, include: [{model: Task, as: 'task'}]})
.then(function(project) {
project.task[0].updateAttributes({
status = 'done';
}).then(function() {
//done!
});
});
来自Erlang 18:
:os.system_time(:millisecond)
提供当前的UNIX时间戳UTC。
感谢@HenrikN关联博文http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html
答案 3 :(得分:14)
如果您不关心时区,只想要纯粹的日期和时间,请使用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
,以获取日期时间结构中的特定日期和时间值。
答案 4 :(得分:11)
我认为你最好的选择是使用Paul Schoenfelder(又名BitWalker)的时间码库来制作Elixir。 lib就在这里:https://github.com/bitwalker/timex你可以从hex.pm https://hex.pm/packages/timex获得包。 Paul很好地解释了如何在github repo的自述页面上使用该库。
你可以调用本机的Erlang库,但我认为保罗的lib在处理Elixir时是优越的。
答案 5 :(得分:9)
这取决于您想要的格式。
您可以使用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
1487550102372148000
您可以通过system_time/1
申请特定单位:
iex(3)> :os.system_time(:millisecond)
1487549663928
自Elixir 1.2以来,这些功能也可以在原生System
module中使用:
iex(4)> System.system_time(:second)
1487549711
对于更友好但仍然使用Elixir的界面,请使用calendar
模块,它将为您提供元组:
iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 26, 47}}
自1.3以来,Elixir还拥有自己的模块来处理日期和时间:Date
和DateTime
。您可以使用其功能获取当前日期或时间,如下所示:
iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:27:51.776208Z>
答案 6 :(得分:5)
您还可以使用:os.timestamp\0
,它从UTC返回{megaseconds, seconds, microseconds}
。 :os.timestamp |> :calendar.now_to_datetime
现在将以erlang标准{{YYYY, MM, DD}, {HH, MM, SS}}
格式提供给您。
答案 7 :(得分:4)
如果您需要处理夏令时或时区,我为此建立了一个库:Calendar。
要获取当前时间,您将使用例如Calendar.DateTime.now("America/Los_Angeles")
表示洛杉矶当前时间,或Calendar.DateTime.now_utc
表示当前UTC时间。
答案 8 :(得分:1)
获取unix时间戳
DateTime.to_unix(DateTime.utc_now)
答案 9 :(得分:1)
要获取毫秒数(Unix时间戳):
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
答案 10 :(得分:0)
好吧,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"