Use actual ISO8601 timestamps for masto API #425

Merged
floatingghost merged 2 commits from darkkirb/akkoma:fix-invalid-datetime into develop 2023-01-09 22:12:29 +00:00
2 changed files with 22 additions and 7 deletions

View file

@ -328,20 +328,27 @@ def date_to_asctime(date) do
end end
def to_masto_date(%NaiveDateTime{} = date) do def to_masto_date(%NaiveDateTime{} = date) do
date # NOTE: Elixirs ISO 8601 format is a superset of the real standard
|> NaiveDateTime.to_iso8601() # It supports negative years for example.
|> String.replace(~r/(\.\d+)?$/, ".000Z", global: false) # 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 end
def to_masto_date(date) when is_binary(date) do def to_masto_date(date) when is_binary(date) do
with {:ok, date} <- NaiveDateTime.from_iso8601(date) do with {:ok, date} <- NaiveDateTime.from_iso8601(date) do
to_masto_date(date) to_masto_date(date)
else else
_ -> "" _ -> "1970-01-01T00:00:00Z"
end end
end end
def to_masto_date(_), do: "" def to_masto_date(_), do: "1970-01-01T00:00:00Z"
defp shortname(name) do defp shortname(name) do
with max_length when max_length > 0 <- with max_length when max_length > 0 <-

View file

@ -495,8 +495,16 @@ test "removes microseconds from date (String)" do
assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z" assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z"
end end
test "returns empty string when date invalid" do test "returns unix epoch when date invalid" do
assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == "" 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
end end