diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index aee19a840..d0452c428 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -328,9 +328,16 @@ def date_to_asctime(date) do end def to_masto_date(%NaiveDateTime{} = date) do - date - |> NaiveDateTime.to_iso8601() - |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false) + # NOTE: Elixir’s ISO 8601 format is a superset of the real standard + # It supports negative years for example. + # ISO8601 only supports years before 1583 with mutual agreement + if date.year < 1583 do + "" + else + date + |> NaiveDateTime.to_iso8601() + |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false) + end end def to_masto_date(date) when is_binary(date) do diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs index a88d7681a..40137a10e 100644 --- a/test/pleroma/web/common_api/utils_test.exs +++ b/test/pleroma/web/common_api/utils_test.exs @@ -498,6 +498,14 @@ test "removes microseconds from date (String)" do test "returns empty string when date invalid" do assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == "" end + + test "returns empty string when date is before the introduction of the Gregorian Calendar" do + assert Utils.to_masto_date("0621-01-01T00:00:00Z") == "" + end + + test "returns empty string when date is BCE" do + assert Utils.to_masto_date("-420-01-01T00:00:00Z") == "" + end end describe "maybe_notify_mentioned_recipients/2" do