6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 1

DateTimeモジュール で遊んでみたシリーズ① -事前準備編

Last updated at Posted at 2024-12-18

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はDateTimeモジュールについて学んだことをまとめます。

目次

1.DateTimeモジュール で遊んでみたシリーズ① -事前準備編(本記事)
2.DateTimeモジュール で遊んでみたシリーズ② -DateTime.add ~ DateTime.compare の紹介
3.DateTimeモジュール で遊んでみたシリーズ③ -DateTime.convert ~ DateTime.from_gregorian_seconds の紹介
4.DateTimeモジュール で遊んでみたシリーズ④ -DateTime.from_iso8601 ~ DateTime.from_naive! の紹介
5.DateTimeモジュール で遊んでみたシリーズ番外編 -Livebookでtzdata導入

目的

DateTimeモジュールに含まれる関数を触って機能を理解したい。
そのためlocalにtzdataのインストールをしたい。

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0
Phoenix v1.7.14

Elixirにおける日付と時刻とは

Elixirの日付と時刻は「特定のタイムゾーンにおける日付と時刻の断面(スナップショット)」です。

日付と時刻の表現一覧

日付と時刻の表現は下記の表の通りです。

シギル名 内容 データ型 例 
~D 日付 Date型 ~D[2015-01-13]
~T 時刻 Time型 ~T[13:00:07]
~U タイムゾーンあり日付と時刻 DateTime型 ~U[2015-01-13 13:00:07Z]
~N タイムゾーン無し日付と時刻 NaiveDateTime型 ~N[2015-01-13 13:00:07]

UTC以外のタイムゾーンを扱いたい場合

ElixirはデフォルトではUTCしか扱えません。
UTC以外のタイムゾーンを扱うにはtzdataなどのライブラリを導入する必要があります。

tzdataの導入

DateTimeモジュールには、引数にタイムゾーンを指定する関数があります。
これらを扱うためにtzdataを導入します。

PJ作成

下記でphoenix PJを作成します

bash
mix phx.new timezone_phx
cd timezone_phx
mix ecto.create

事前確認

tzdataを未導入の状態で引数にタイムゾーンを指定する関数を使うとどうなるか確認しておきましょう。

bash
iex -S mix
Interactive Elixir (1.17.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
iex
Application.get_env(:elixir, :time_zone_database)
Calendar.UTCOnlyTimeZoneDatabase

UTC以外のタイムゾーンを扱おうとするとエラーになります。

iex
DateTime.from_naive!(~N[2018-11-15 10:00:00], "Europe/Copenhagen", Calendar.UTCOnlyTimeZoneDatabase)
** (ArgumentError) cannot convert ~N[2018-11-15 10:00:00] to datetime, reason: :utc_only_time_zone_database
    (elixir 1.17.3) lib/calendar/datetime.ex:697: DateTime.from_naive!/3
    #cell:wmgxue6myjgaginj:1: (file)

mix.exs

下記を追加します。

mix.exs
   defp deps do
     [
       {:phoenix, "~> 1.7.14"},
       {:phoenix_ecto, "~> 4.5"},
       ...
-      {:bandit, "~> 1.5"}
+      {:bandit, "~> 1.5"},
+      {:tzdata, "~> 1.1"}
     ]
   end

config.exs

最終行の次に下記を追加します。

config/config.exs
+ config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase

mix.deps.get

tzdataを取得します。

bash
mix deps.get

動作確認

:time_zone_databaseの値が変わったことを確認します。

iex
Application.get_env(:elixir, :time_zone_database)
Tzdata.TimeZoneDatabase

引数にタイムゾーンを指定する関数を使ってみます。

iex
DateTime.from_naive!(~N[2018-11-15 10:00:00], "Europe/Copenhagen", Calendar.UTCOnlyTimeZoneDatabase)
#DateTime<2018-11-15 10:00:00+01:00 CET Europe/Copenhagen>

無事、UTC以外のタイムゾーンが扱えるようになりました(^▽^)/

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?