【问题标题】:Getting the current date and or time in Elixir在 Elixir 中获取当前日期和/或时间
【发布时间】:2015-04-20 02:31:42
【问题描述】:

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    天真日期时间

    如果您不关心时区而只想要纯日期和时间,请使用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 结构中获取特定的日期和时间值。

    【讨论】:

      【解决方案2】:

      嗯,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"
      

      【讨论】:

        【解决方案3】:

        这取决于你想要的格式。

        您可以使用 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 还拥有自己的一组用于操作日期和时间的模块:DateDateTime。您可以使用它的函数来获取当前日期或时间,如下所示:

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

        【讨论】:

          【解决方案4】:

          获取毫秒数(Unix Timestamp):

          DateTime.utc_now() |> DateTime.to_unix(:millisecond)
          

          【讨论】:

          【解决方案5】:

          您可以使用DateTime.utc_now/0 获取UTC DateTime。

          【讨论】:

            【解决方案6】:

            获取unix时间戳

            DateTime.to_unix(DateTime.utc_now)
            

            【讨论】:

            【解决方案7】:

            从 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

            【讨论】:

            【解决方案8】:

            如果您需要处理夏令时或时区,我为此创建了一个库:Calendar

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

            【讨论】:

              【解决方案9】:

              您也可以使用:os.timestamp\0,它从UTC 返回{megaseconds, seconds, microseconds}:os.timestamp |&gt; :calendar.now_to_datetime 现在将以 erlang 标准 {{YYYY, MM, DD}, {HH, MM, SS}} 格式为您提供。

              【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 很好的答案,谢谢你们,我一定会去看看 Timex!
              • 我们现在有:DateTime.utc_now()。和Calendar.strftime/2 格式化它。
              【解决方案11】:

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

              你可以调用原生 Erlang 库,但我认为 Paul 的库在处理 Elixir 时更胜一筹。

              【讨论】:

              • 感谢小野的推荐!对于阅读本文的任何人,我都非常愿意做出贡献,以便我们可以让 Timex 成为 Elixir 中日期/时间的库,如果它应该达到标准,也许有一天会将它合并到 Elixir 标准库中。如果您有兴趣提供帮助,请给我发消息或深入 GitHub 上的问题跟踪器并发送一些拉取请求!
              • @bitwalker 是的,Erlang/Elixir 对日期/时间库有很多事情要做。我希望 timex 也可以合并到 Elixir 中:)
              猜你喜欢
              • 2015-03-22
              • 2012-12-04
              • 2012-04-29
              • 2015-11-12
              • 2015-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多