ElixirSchoolの勉強メモです。
Time
# 現在の時刻を取得する
iex(39)> Time.utc_now
~T[15:12:13.525286]
# Time構造体を作るためにシギルを使える
iex(40)> ~T[19:39:13.056226]
~T[19:39:13.056226]
iex(41)> t = ~T[19:39:31.056226]
~T[19:39:31.056226]
iex(42)> t.hour
19
iex(43)> t.minute
39
iex(44)> t.day
** (KeyError) key :day not found in: ~T[19:39:31.056226]
構造体の名前にアクセスできるが、この構造体は1日の時間帯のみを含んでいて、日/月/年のデータはありません。
Date
Time
に対してDate
構造体は現在の日付に関する情報を持ち、現在の時間に関する情報は持たない。
iex(44)> Date.utc_today
~D[2022-12-17]
iex(46)> {:ok, date} = Date.new(2020, 12,12)
{:ok, ~D[2020-12-12]}
# 与えられた日時がどの曜日にあたるのかを計算する
iex(47)> Date.day_of_week date
6
# うるう年かチェックする
iex(48)> Date.leap_year? date
true
NaiveDateTime
Elixirには日付と時間を同時に含む構造体が2種類ある。
NatveDateTime
はタイムゾーンのサポートがない。
iex(49)> NaiveDateTime.utc_now
~N[2022-12-17 15:19:33.758957]
DateTime
DateTime
は時間と日時を両方持ち、タイムゾーンもサポートしている。
また、タイムゾーンを提供するだけでなく、NaiveDateTimeからDateTimeのインスタンスを作ることができる。
iex(50)> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, ~U[2016-05-24 13:26:08.003Z]}
タイムゾーンの利用
Elixir本体にはタイムゾーンデータがない。
この問題を解決するには tzdata パッケージをインストールして設定する必要がある。
それをインストールした後、Tzdataをタイムゾーンデータベースとして使用するように、Elixirグローバル設定をする必要がある。
下記をPJのmix.exsのdepsに追加し、mix deps.get
をする
{:tzdata, "~> 1.1"},
config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase
iex(2)> paris_datetime = DateTime.from_naive!(~N[2019-01-01 12:00:00], "Europe/Paris")
** (ArgumentError) cannot convert ~N[2019-01-01 12:00:00] to datetime, reason: :utc_only_time_zone_database
(elixir 1.14.2) lib/calendar/datetime.ex:635: DateTime.from_naive!/3