From c3f77d411cb9b7c064342479634be1ae49c4e506 Mon Sep 17 00:00:00 2001 From: Kip Cole Date: Fri, 25 Sep 2026 07:42:11 +1000 Subject: [PATCH] Fix Date.from_gregorian_days/2 Date.from_gregorian_days/2 was passing {days, 0} to from_iso_days/2 which is an invalid day fraction. The day fraction is ignored in Calendar.ISO so the error is only surfaced with non-Calendar.ISO calendars. The day fraction is now correctly passed as {0, 86_400}. --- lib/elixir/lib/calendar/date.ex | 2 +- lib/elixir/test/elixir/calendar/date_test.exs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/elixir/lib/calendar/date.ex b/lib/elixir/lib/calendar/date.ex index 54481502391..c3184cf9906 100644 --- a/lib/elixir/lib/calendar/date.ex +++ b/lib/elixir/lib/calendar/date.ex @@ -508,7 +508,7 @@ defmodule Date do @doc since: "1.11.0" @spec from_gregorian_days(integer(), Calendar.calendar()) :: t def from_gregorian_days(days, calendar \\ Calendar.ISO) when is_integer(days) do - from_iso_days({days, 0}, calendar) + from_iso_days({days, {0, 86_400}}, calendar) end @doc """ diff --git a/lib/elixir/test/elixir/calendar/date_test.exs b/lib/elixir/test/elixir/calendar/date_test.exs index 81a233133f5..6f2fcc8ce01 100644 --- a/lib/elixir/test/elixir/calendar/date_test.exs +++ b/lib/elixir/test/elixir/calendar/date_test.exs @@ -204,6 +204,19 @@ defmodule DateTest do fn -> Date.convert!(~D[2016-02-03], FakeCalendar) end end + test "from_gregorian_days/2" do + assert Date.from_gregorian_days(730_485, Calendar.Holocene) == + Calendar.Holocene.date(12000, 01, 01) + + assert Date.from_gregorian_days(-1, Calendar.Holocene) == + Calendar.Holocene.date(9999, 12, 31) + + for days <- [-1_000_000, 0, 1, 1_000_000] do + date = Date.from_gregorian_days(days, Calendar.Holocene) + assert Date.to_gregorian_days(date) == days + end + end + test "add/2" do assert Date.add(~D[0000-01-01], 3_652_424) == ~D[9999-12-31] assert Date.add(~D[0000-01-01], 3_652_425) == Date.new!(10000, 1, 1)