获取Elixir的当前日期和时间

时间:2015-02-18 21:51:50

标签: elixir

这似乎是一个非常愚蠢的问题,但是如何获得并显示Elixir中的当前日期或时间?我试过the docs但是找不到任何东西。我需要使用Erlang功能吗?

11 个答案:

答案 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

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,以获取日期时间结构中的特定日期和时间值。

答案 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还拥有自己的模块来处理日期和时间:DateDateTime。您可以使用其功能获取当前日期或时间,如下所示:

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"