Skip to content

Commit 950bcc0

Browse files
wingyplusjosevalim
authored andcommitted
Fix Calendar.strftime/2 format negative year incorrectly (#12268)
Closes #12266
1 parent 80564fc commit 950bcc0

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

lib/elixir/lib/calendar.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,14 @@ defmodule Calendar do
791791

792792
# Year
793793
defp format_modifiers("Y" <> rest, width, pad, datetime, format_options, acc) do
794-
result = datetime.year |> Integer.to_string() |> pad_leading(width, pad)
794+
{sign, year} =
795+
if datetime.year < 0 do
796+
{?-, -datetime.year}
797+
else
798+
{[], datetime.year}
799+
end
800+
801+
result = [sign | year |> Integer.to_string() |> pad_leading(width, pad)]
795802
parse(rest, datetime, format_options, [result | acc])
796803
end
797804

lib/elixir/test/elixir/calendar_test.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,5 +364,12 @@ defmodule CalendarTest do
364364
Calendar.strftime(~D[2019-08-15], "%D", unknown: "option")
365365
end
366366
end
367+
368+
test "zero padding for negative year" do
369+
assert Calendar.strftime(Date.new!(-1, 1, 1), "%Y") == "-0001"
370+
assert Calendar.strftime(Date.new!(-11, 1, 1), "%Y") == "-0011"
371+
assert Calendar.strftime(Date.new!(-111, 1, 1), "%Y") == "-0111"
372+
assert Calendar.strftime(Date.new!(-1111, 1, 1), "%Y") == "-1111"
373+
end
367374
end
368375
end

0 commit comments

Comments
 (0)