やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

日本(Asia/Tokyo)の今日の日付をelixirで取得する

何回も書く機会があるので、まとめておこうと思います。
何も外部ライブラリをインストールしていない状態ではEtc/UTC以外のタイムゾーンを使用することができません。自分のようにAsia/Tokyoを使いたい人はTzdataTimexといった外部ライブラリをインストールする必要があります。

elixirschool.com

現在の日付を取得する関数(Date.utc_today())が標準ライブラリとして実装されていますが、当然ながらUTCタイムゾーンでの現在日しか取得することができません。

iex(8)> Date.utc_today()
~D[2023-04-09]

hexdocs.pm

ちょっとした処理を書きたいだけなのに、外部ライブラリをインストールしないといけないのは面倒です。
...ということで、外部ライブラリなしで日本の現在の日時を取得する方法を紹介したいと思います。

多分これが一番早いと思います

defmodule AsiaTokyo.Date do
  def now, do: with { :ok, date } <- new_date(), do: date
  defp new_date do
    {{ year, month, date }, _} = :calendar.local_time()
    Date.new(year, month, date)
  end
end


AsiaTokyo.Date.now |> IO.inspect # ~D[2023-04-09]

※PCに設定されたタイムゾーンの設定値に依存するので、マシンによっては結果が変わる可能性があります。

筆者の動作環境