From ce996583d577161e4372ccc3a4da8d09ad67668d Mon Sep 17 00:00:00 2001 From: Theodor Fiedler Date: Mon, 17 Feb 2025 21:28:19 +0100 Subject: [PATCH 1/3] do not truncate microseconds in DateTime.diff/3 resolves #14273 --- lib/elixir/lib/calendar/datetime.ex | 8 +++++--- lib/elixir/test/elixir/calendar/datetime_test.exs | 11 +++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/elixir/lib/calendar/datetime.ex b/lib/elixir/lib/calendar/datetime.ex index 19776dbff33..b945c0ab99b 100644 --- a/lib/elixir/lib/calendar/datetime.ex +++ b/lib/elixir/lib/calendar/datetime.ex @@ -1599,11 +1599,13 @@ defmodule DateTime do end naive_diff = - (datetime1 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(unit)) - - (datetime2 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(unit)) + (datetime1 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(:microsecond)) - + (datetime2 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(:microsecond)) offset_diff = utc_offset2 + std_offset2 - (utc_offset1 + std_offset1) - naive_diff + System.convert_time_unit(offset_diff, :second, unit) + + System.convert_time_unit(naive_diff, :microsecond, unit) + + System.convert_time_unit(offset_diff, :second, unit) end @doc """ diff --git a/lib/elixir/test/elixir/calendar/datetime_test.exs b/lib/elixir/test/elixir/calendar/datetime_test.exs index 8699825e0ff..3ff6c186afa 100644 --- a/lib/elixir/test/elixir/calendar/datetime_test.exs +++ b/lib/elixir/test/elixir/calendar/datetime_test.exs @@ -807,6 +807,17 @@ defmodule DateTimeTest do # Test with a non-struct map conforming to Calendar.datetime assert DateTime.diff(Map.from_struct(dt1), Map.from_struct(dt2)) == 3_281_904_000 end + + test "diff with microseconds" do + datetime = ~U[2023-02-01 10:30:10.000000Z] + + in_almost_7_days = + datetime + |> DateTime.add(7, :day) + |> DateTime.add(-1, :microsecond) + + assert DateTime.diff(in_almost_7_days, datetime, :day) == 6 + end end describe "from_naive" do From dc93699ef16a4d831c2b01f306a63f72fa5759a9 Mon Sep 17 00:00:00 2001 From: Theodor Fiedler Date: Mon, 17 Feb 2025 21:36:56 +0100 Subject: [PATCH 2/3] test diff in microseconds --- lib/elixir/test/elixir/calendar/datetime_test.exs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/elixir/test/elixir/calendar/datetime_test.exs b/lib/elixir/test/elixir/calendar/datetime_test.exs index 3ff6c186afa..e6199b264c9 100644 --- a/lib/elixir/test/elixir/calendar/datetime_test.exs +++ b/lib/elixir/test/elixir/calendar/datetime_test.exs @@ -818,6 +818,13 @@ defmodule DateTimeTest do assert DateTime.diff(in_almost_7_days, datetime, :day) == 6 end + + test "diff in microseconds" do + datetime1 = ~U[2023-02-01 10:30:10.000000Z] + datetime2 = DateTime.add(datetime1, 1234, :microsecond) + + assert DateTime.diff(datetime1, datetime2, :microsecond) == -1234 + end end describe "from_naive" do From 3b5e43aa03107b848752bf25c1b2feeca9ffe567 Mon Sep 17 00:00:00 2001 From: Theodor Fiedler Date: Mon, 17 Feb 2025 22:23:48 +0100 Subject: [PATCH 3/3] make microsecond test more meaningful --- lib/elixir/test/elixir/calendar/datetime_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir/test/elixir/calendar/datetime_test.exs b/lib/elixir/test/elixir/calendar/datetime_test.exs index e6199b264c9..712e34633ee 100644 --- a/lib/elixir/test/elixir/calendar/datetime_test.exs +++ b/lib/elixir/test/elixir/calendar/datetime_test.exs @@ -809,7 +809,7 @@ defmodule DateTimeTest do end test "diff with microseconds" do - datetime = ~U[2023-02-01 10:30:10.000000Z] + datetime = ~U[2023-02-01 10:30:10.123456Z] in_almost_7_days = datetime