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
+ "1970-01-01T00:00:00Z"
+ else
+ date
+ |> NaiveDateTime.to_iso8601()
+ |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
+ end
end
def to_masto_date(date) when is_binary(date) do
with {:ok, date} <- NaiveDateTime.from_iso8601(date) do
to_masto_date(date)
else
- _ -> ""
+ _ -> "1970-01-01T00:00:00Z"
end
end
- def to_masto_date(_), do: ""
+ def to_masto_date(_), do: "1970-01-01T00:00:00Z"
defp shortname(name) do
with max_length when max_length > 0 <-
assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z"
end
- test "returns empty string when date invalid" do
- assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == ""
+ test "returns unix epoch when date invalid" do
+ assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == "1970-01-01T00:00:00Z"
+ end
+
+ test "returns unix epoch when date is before the introduction of the Gregorian Calendar" do
+ assert Utils.to_masto_date("0621-01-01T00:00:00Z") == "1970-01-01T00:00:00Z"
+ end
+
+ test "returns unix epoch when date is BCE" do
+ assert Utils.to_masto_date("-0420-01-01T00:00:00Z") == "1970-01-01T00:00:00Z"
end
end