Elixirで現在の日付や時刻を取得する


83

これは本当にばかげた質問のようですが、Elixirで現在の日付または時刻を取得して表示するにはどうすればよいですか?私はを通過しようとしたドキュメントが、何かを見つけることができませんでした。アーラン関数を使用する必要がありますか?

回答:


56

あなたの質問にもっと具体的に答えるために(私はTimexを使うというOnorioの推薦に本当に感謝しています!)、:calendar.universal_time()またはを使ってErlang標準ライブラリから現在の日付と時刻を得ることができます:calendar.local_time()。モジュールdatetime内でErlangの型を操作するのに役立つ関数はたくさんありますが、calendarそれらは多少制限されており、Timexの出番である日付の解析やフォーマットには何も提供されていません。


1
素晴らしい答えです、両方に感謝します、そして私は間違いなくTimexをチェックします!
Graham Conzett 2015



17

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/1およびto_time/1を呼び出して、datetime構造体から特定の日付と時刻の値を取得することもできます。


12

あなたの最善の策は、ElixirにPaul Schoenfelder(別名BitWalker)のtimexライブラリを使用することだと思います。libはここにあります:https//github.com/bitwalker/timexそしてあなたはhex.pmhttps //hex.pm/packages/timexからパッケージを得ることができます。Paulは、そのgithubリポジトリのreadmeページでライブラリの使用方法について適切な説明を提供してくれました。

ネイティブのErlangライブラリを呼び出すこともできますが、Elixirを扱う場合は、Paulのライブラリの方が優れていると思います。


5
オノリオを推薦してくれてありがとう!これを読んでいる人なら誰でも、TimexをElixirの日付/時刻のライブラリに移動できるように、そしておそらくいつかそれが標準に達する必要がある場合はElixir標準ライブラリにマージできるように貢献してくれます。支援に興味がある場合は、メッセージを送信するか、GitHubの課題追跡システムに飛び込んでプルリクエストを送信してください。
ビットウォーカー2015

1
@bitwalkerええ、Erlang / Elixirには日付/時刻ライブラリに対してやるべきことがたくさんあります。そして、timexもElixirにマージできることを願っています:)
Tony Han

11

それはあなたがそれをどのフォーマットにしたいかによります。

ElixirのErlang標準ライブラリの任意の関数を使用できます。伝統的に、あなたはnow/0関数で時間を得るでしょう:

iex(1)> :erlang.now
{1487, 549978, 29683}

それは表しtime_t38.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以来、エリクサーも日付や時刻を操作するためのモジュールの独自のスイートを持っていますDateDateTime。その関数を使用して、次のように現在の日付または時刻を取得できます。

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

8

ミリ秒数を取得するには(Unixタイムスタンプ):

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

1
素敵なサム、私が探していたもの;)
デニス

7

UTCから:os.timestamp\0戻る{megaseconds, seconds, microseconds}を使用することもできます。:os.timestamp |> :calendar.now_to_datetimeerlang標準{{YYYY, MM, DD}, {HH, MM, SS}}フォーマットで提供されます。


3
そして、それをPOSIX / UNIXタイムスタンプに取り込むには
Henrik N

6

夏時間またはタイムゾーンを処理する必要がある場合は、そのためのライブラリを作成しました:カレンダー

現在の時刻を取得するには、たとえばCalendar.DateTime.now("America/Los_Angeles")ロサンゼルスCalendar.DateTime.now_utcの現在の時刻またはUTCの現在の時刻を使用します。


2

UNIXタイムスタンプを取得するには

DateTime.to_unix(DateTime.utc_now)

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.