Dates & Times

Types: Date (calendar date), Time (wall time), NaiveDateTime (no zone), DateTime (with zone), Duration.

Types: Date (calendar date), Time (wall time), NaiveDateTime (no zone), DateTime (with zone), Duration. Use :timex for richer utilities.

Date.utc_today()
d = ~D[2026-10-25]
Date.add(d, 30), Date.diff(~D[2027-01-01], d), Date.day_of_week(d)
Date.beginning_of_month(d), Date.end_of_month(d), Date.leap_year?(d)
Date.range(~D[2026-01-01], ~D[2026-01-07]) |> Enum.to_list()
Date.compare(d, ~D[2026-01-01])              # :gt
Date.from_iso8601!("2026-10-25"), Date.to_iso8601(d)

Time.utc_now(), Time.add(~T[10:00:00], 3600)
NaiveDateTime.utc_now(), NaiveDateTime.add(~N[2026-10-25 10:00:00], 60, :second)

dt = DateTime.utc_now()
DateTime.to_unix(dt), DateTime.from_unix!(1_700_000_000)
DateTime.truncate(dt, :second), DateTime.diff(dt, ~U[2026-01-01 00:00:00Z], :hour)
DateTime.shift_zone(dt, "Europe/Oslo")        # needs a tz database such as :tzdata or :tz
Calendar.strftime(dt, "%Y-%m-%d %H:%M")

# Duration & shift (1.17+)
Date.shift(d, month: 1, day: 3)
DateTime.shift(dt, Duration.new!(hour: 2, minute: 30))