日付と時間

この和訳は最新です。

Elixirで時間を扱ってみましょう。

目次

Time

Elixirは時間を扱うためのいくつかのモジュールを持っています。 ただし、この機能はUTCタイムゾーンとの連携に限定されている点に気をつける必要があります。

現在時刻の取得から始めてみましょう:

iex> Time.utc_now
~T[19:39:31.056226]

Time 構造体を作るためにシギルも使えます:

iex> ~T[19:39:31.056226]
~T[19:39:31.056226]

シギルについては シギルのレッスン で詳細を学ぶことができます。 この構造体の各値にアクセスするのは簡単です:

iex> t = ~T[19:39:31.056226]
~T[19:39:31.056226]
iex> t.hour
19
iex> t.minute
39
iex> t.day
** (KeyError) key :day not found in: ~T[19:39:31.056226]

しかし、ここには落とし穴があります。気が付いたかもしれませんが、この構造体は1日の時間のみを含んでいて、日/月/年のデータはありません。

Date

Time に対して、 Date 構造体は現在の日付に関する情報を持ち、現在の時間に関する情報は含みません。

iex> Date.utc_today
~D[2028-10-21]

それから、これは日にちと連携する便利な関数をいくつか持っています:

iex> {:ok, date} = Date.new(2020, 12,12)
{:ok, ~D[2020-12-12]}
iex> Date.day_of_week date
6
iex> Date.leap_year? date
true

day_of_week/1 は与えられた日付がどの曜日にあたるのかを計算します。 この場合は土曜日です。 leap_year?/1 は閏年かどうかをチェックします。 その他の関数は doc で探すことができます。

NaiveDateTime

Elixirには日付と時間を同時に含む構造体が2種類あります。 最初に紹介するのは NaiveDateTime です。 この構造体のデメリットはタイムゾーンのサポートが無いという点です:

iex(15)> NaiveDateTime.utc_now
~N[2029-01-21 19:55:10.008965]

しかし、これは現在の時間と日付を両方持っているので、次の例のように時間を足すことも可能です:

iex> NaiveDateTime.add(~N[2018-10-01 00:00:14], 30)
~N[2018-10-01 00:00:44]

DateTime

2つ目は、このセクションのタイトルから想像がつくように、 DateTime です。 NaiveDateTime で記載したような制限はありません。そのため、これは時間と日付を両方持ち、タイムゾーンもサポートしています。 しかしタイムゾーンについては注意してください。公式ドキュメントではこのように記載されています:

このモジュールには変換関数とUTCで動作する関数だけが含まれていることに気付くでしょう。
これは、適切なDateTimeの実装には、現時点でElixirの機能として提供されていないタイムゾーンデータベースを必要とするためです。

また、タイムゾーンを提供するだけで、NaiveDateTimeからDateTimeのインスタンスを作ることができます:

iex> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, #DateTime<2016-05-24 13:26:08.003Z>}

これがそうです!さらに高度な他の機能を使いたい場合は、 TimeDateDateTimeNaiveDateTime のドキュメントをさらに確認することを考慮するといいでしょう。 Elixirで時間を扱うパワフルなライブラリである TimexCalendar についても考慮するべきです。

Caught a mistake or want to contribute to the lesson? Edit this page on GitHub!