これは本当にばかげた質問のようですが、Elixirで現在の日付または時刻を取得して表示するにはどうすればよいですか?私はを通過しようとしたドキュメントが、何かを見つけることができませんでした。アーラン関数を使用する必要がありますか?
これは本当にばかげた質問のようですが、Elixirで現在の日付または時刻を取得して表示するにはどうすればよいですか?私はを通過しようとしたドキュメントが、何かを見つけることができませんでした。アーラン関数を使用する必要がありますか?
回答:
あなたの質問にもっと具体的に答えるために(私はTimexを使うというOnorioの推薦に本当に感謝しています!)、:calendar.universal_time()
またはを使ってErlang標準ライブラリから現在の日付と時刻を得ることができます:calendar.local_time()
。モジュールdatetime
内でErlangの型を操作するのに役立つ関数はたくさんありますが、calendar
それらは多少制限されており、Timexの出番である日付の解析やフォーマットには何も提供されていません。
DateTime.utc_now/0
UTCDateTimeを取得するために使用できます。
Erlang 19.1から:
:os.system_time(:millisecond)
Erlang 18から:
:os.system_time(:milli_seconds)
現在のUNIXタイムスタンプUTCを提供します。
ブログ投稿http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.htmlにリンクしてくれた@HenrikNに感謝します
タイムゾーンを気にせず、純粋な日付と時刻が必要な場合は、次を使用して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ライブラリを使用することだと思います。libはここにあります:https://github.com/bitwalker/timexそしてあなたはhex.pmhttps : //hex.pm/packages/timexからパッケージを得ることができます。Paulは、そのgithubリポジトリのreadmeページでライブラリの使用方法について適切な説明を提供してくれました。
ネイティブのErlangライブラリを呼び出すこともできますが、Elixirを扱う場合は、Paulのライブラリの方が優れていると思います。
それはあなたがそれをどのフォーマットにしたいかによります。
ElixirのErlang標準ライブラリの任意の関数を使用できます。伝統的に、あなたはnow/0
関数で時間を得るでしょう:
iex(1)> :erlang.now
{1487, 549978, 29683}
それは表しtime_t
38.29683秒2017年2月20日(月曜日)の真夜中のUTCた後、19分である、1,487,549,978.29683を。
ただし、Erlang / OTP 18以降、この関数は非推奨になりました。その理由の1つは、Erlangが呼び出しごとに戻り値が増加することを保証していることです。マイクロ秒に2回以上呼び出すのに十分な速さでマシン上でタイトなループで呼び出すと、返されるタイムスタンプはリアルタイムよりも早くなります。
代替品は、より正確で制御性の高い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以来、エリクサーも日付や時刻を操作するためのモジュールの独自のスイートを持っていますDate
とDateTime
。その関数を使用して、次のように現在の日付または時刻を取得できます。
iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>
さて、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"