2
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 2

DateTimeモジュール で遊んでみたシリーズ② -DateTime.add ~ DateTime.compare の紹介

Last updated at Posted at 2024-12-21

こんにちは!
プログラミング未経験文系出身、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モジュールに含まれる関数を触って機能を理解したい

実行環境

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

前提

本記事を手元検証するには、前提としてtzdataの導入が必要です。
まだの場合は下記1.または2.で準備をしてください。

1.local環境でtzdataの導入

2.Livebookでtzdataの導入

DateTime.addとは

DateTime.add(datetime, amount_to_add, unit \\ :second, time_zone_database \\ Calendar.get_time_zone_database())datetimeunit単位のamount_to_addを加えます。

タイムゾーン無しの場合

iex
DateTime.add(~U[2018-11-15 10:00:00Z], 3600, :second)

3600秒 = 1時間後の値を返します。

~U[2018-11-15 11:00:00Z]

タイムゾーンありの場合

iex
# datetimeにあたる変数の定義
dt = DateTime.from_naive!(~N[2018-11-15 10:00:00], "Europe/Copenhagen", Tzdata.TimeZoneDatabase) 
#DateTime<2018-11-15 10:00:00+01:00 CET Europe/Copenhagen>

1日後の値を返します。

iex
dt |> DateTime.add(1, :day, Tzdata.TimeZoneDatabase)
#DateTime<2018-11-16 10:00:00+01:00 CET Europe/Copenhagen>

サマータイム開始/終了時刻をまたぐ場合

米国ニューヨークの次のサマータイム開始時刻1は、現地時刻の3/9の02:00です。
このタイミングで時計が1時間進みます2
これをまたいで使用する場合自動調整が入ります。

iex
# datetimeにあたる変数の定義
dt = DateTime.from_naive!(~N[2025-03-09 01:59:59.123], "America/New_York", Tzdata.TimeZoneDatabase)

この時点では"EST"(米国東部標準時)の表示になっています。

#DateTime<2025-03-09 01:59:59.123-05:00 EST America/New_York>

サマータイム開始時刻をまたいで3秒後にしてみましょう。

iex
dt |> DateTime.add(3, :second, Tzdata.TimeZoneDatabase)

サマータイム開始時刻の1時間+3秒後の値を返します。
また、"EDT"(米国東部夏時間)の表示になっています。

#DateTime<2025-03-09 03:00:02.123-04:00 EDT America/New_York>

DateTime.after?とは

DateTime.after?(datetime1, datetime2)datetime1datetime2より後の日時であるか否かをチェックします。

iex
DateTime.after?(~U[2021-01-01 11:00:01Z], ~U[2021-01-01 11:00:00Z])
true
iex
DateTime.after?(~U[2021-01-01 11:00:00Z], ~U[2021-01-01 11:00:01Z])
false

datetime1datetime2が同じ場合
falseを返します。

iex
DateTime.after?(~U[2021-01-01 11:00:00Z], ~U[2021-01-01 11:00:00Z])
false

DateTime.before?とは

DateTime.after?(datetime1, datetime2)datetime1datetime2より前の日時であるか否かをチェックします。

iex
DateTime.before?(~U[2021-01-01 11:00:00Z], ~U[2021-01-01 11:00:01Z])
true
iex
DateTime.before?(~U[2021-01-01 11:00:01Z], ~U[2021-01-01 11:00:00Z])
false

datetime1datetime2が同じ場合
falseを返します。

iex
DateTime.before?(~U[2021-01-01 11:00:00Z], ~U[2021-01-01 11:00:00Z])
false

DateTime.compareとは

DateTime.compare(datetime1, datetime2)datetime1datetime2を比較します。
次のいずれかを返します。

  • :gt datetime1datetime2より後の日時である場合3
  • :lt datetime1datetime2より前の日時である場合
    ‐ :eq datetime1datetime2が同じ場合

iex
dt1 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
                utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}

dt2 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}

dt3= %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex
DateTime.compare(dt1, dt2)
:gt
iex
DateTime.compare(dt2, dt1)
:lt
iex
DateTime.compare(dt2, dt3)
:eq

~Elixirの国のご案内~

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

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

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

  1. サマータイム開始時刻を"Spring Forward", サマータイム終了時刻を"fall back"と呼びます。エラーハンドリングのfallbackと混同する!紛らわしい!https://aupairjapanese.com/?p=513

  2. https://www.timeanddate.com/time/change/usa?year=2025

  3. :gt means "greater than", :lt means "less than", :eq means "equal to" https://tobe-happy.com/lt_gt/#google_vignette

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

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

2
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
2
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?