Skip to content

Commit d3b8dcd

Browse files
committed
Fallback to executable implementation when year is out of ISO range
Closes #13712 Closes #13720
1 parent 763543c commit d3b8dcd

File tree

6 files changed

+22
-12
lines changed

6 files changed

+22
-12
lines changed

lib/elixir/lib/calendar/date.ex

+2-3
Original file line numberDiff line numberDiff line change
@@ -1159,12 +1159,11 @@ defmodule Date do
11591159

11601160
defimpl Inspect do
11611161
def inspect(%{calendar: calendar, year: year, month: month, day: day}, _)
1162-
when year in -9999..9999 do
1162+
when calendar != Calendar.ISO or year in -9999..9999 do
11631163
"~D[" <> calendar.date_to_string(year, month, day) <> suffix(calendar) <> "]"
11641164
end
11651165

1166-
def inspect(%{calendar: calendar, year: year, month: month, day: day}, _)
1167-
when calendar == Calendar.ISO do
1166+
def inspect(%{calendar: Calendar.ISO, year: year, month: month, day: day}, _) do
11681167
"Date.new!(#{Integer.to_string(year)}, #{Integer.to_string(month)}, #{Integer.to_string(day)})"
11691168
end
11701169

lib/elixir/lib/calendar/datetime.ex

+2-1
Original file line numberDiff line numberDiff line change
@@ -2079,7 +2079,8 @@ defmodule DateTime do
20792079
)
20802080

20812081
case datetime do
2082-
%{utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"} ->
2082+
%{utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC", year: year}
2083+
when calendar != Calendar.ISO or year in -9999..9999 ->
20832084
"~U[" <> formatted <> suffix(calendar) <> "]"
20842085

20852086
_ ->

lib/elixir/lib/calendar/naive_datetime.ex

+9-4
Original file line numberDiff line numberDiff line change
@@ -1451,10 +1451,15 @@ defmodule NaiveDateTime do
14511451
calendar: calendar
14521452
} = naive_datetime
14531453

1454-
formatted =
1455-
calendar.naive_datetime_to_string(year, month, day, hour, minute, second, microsecond)
1456-
1457-
"~N[" <> formatted <> suffix(calendar) <> "]"
1454+
if calendar != Calendar.ISO or year in -9999..9999 do
1455+
formatted =
1456+
calendar.naive_datetime_to_string(year, month, day, hour, minute, second, microsecond)
1457+
1458+
"~N[" <> formatted <> suffix(calendar) <> "]"
1459+
else
1460+
"NaiveDateTime.new!(#{Integer.to_string(year)}, #{Integer.to_string(month)}, #{Integer.to_string(day)}, " <>
1461+
"#{Integer.to_string(hour)}, #{Integer.to_string(minute)}, #{Integer.to_string(second)}, #{inspect(microsecond)})"
1462+
end
14581463
end
14591464

14601465
defp suffix(Calendar.ISO), do: ""

lib/elixir/test/elixir/calendar/date_test.exs

+4-4
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ defmodule DateTest do
5959
date = %{~D[2000-01-01] | calendar: FakeCalendar}
6060
assert inspect(date) == "~D[1/1/2000 FakeCalendar]"
6161

62-
assert inspect(Date.new!(5_874_897, 12, 31)) == "Date.new!(5874897, 12, 31)"
63-
assert inspect(Date.new!(-5_874_897, 1, 1)) == "Date.new!(-5874897, 1, 1)"
62+
assert inspect(Date.new!(99999, 12, 31)) == "Date.new!(99999, 12, 31)"
63+
assert inspect(Date.new!(-99999, 1, 1)) == "Date.new!(-99999, 1, 1)"
6464

65-
date2 = %{Date.new!(5_874_897, 12, 31) | calendar: FakeCalendar}
65+
date2 = %{Date.new!(99999, 12, 31) | calendar: FakeCalendar}
6666

6767
assert inspect(%{date2 | calendar: FakeCalendar}) ==
68-
"Date.new!(5874897, 12, 31, FakeCalendar)"
68+
"~D[31/12/99999 FakeCalendar]"
6969
end
7070

7171
test "compare/2" do

lib/elixir/test/elixir/calendar/datetime_test.exs

+2
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ defmodule DateTimeTest do
140140
utc_datetime = ~U[2000-01-01 23:00:07.005Z]
141141
assert inspect(utc_datetime) == "~U[2000-01-01 23:00:07.005Z]"
142142

143+
assert inspect(%{utc_datetime | year: 99999}) == "#DateTime<99999-01-01 23:00:07.005Z>"
144+
143145
assert inspect(%{utc_datetime | calendar: FakeCalendar}) ==
144146
"~U[1/1/2000F23::0::7 Etc/UTC UTC 0 0 FakeCalendar]"
145147

lib/elixir/test/elixir/calendar/naive_datetime_test.exs

+3
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ defmodule NaiveDateTimeTest do
100100
assert inspect(~N[2000-01-01 23:00:07.005]) == "~N[2000-01-01 23:00:07.005]"
101101
assert inspect(~N[-0100-12-31 23:00:07.005]) == "~N[-0100-12-31 23:00:07.005]"
102102

103+
assert inspect(%{~N[2000-01-01 23:00:07.005] | year: 99999}) ==
104+
"NaiveDateTime.new!(99999, 1, 1, 23, 0, 7, {5000, 3})"
105+
103106
ndt = %{~N[2000-01-01 23:00:07.005] | calendar: FakeCalendar}
104107
assert inspect(ndt) == "~N[1/1/2000F23::0::7 FakeCalendar]"
105108
end

0 commit comments

Comments
 (0)