Skip to content

Commit 8f6cb5d

Browse files
Do not truncate microseconds in DateTime.diff/3 (#14274)
Closes #14273
1 parent b393dcc commit 8f6cb5d

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

lib/elixir/lib/calendar/datetime.ex

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,11 +1599,13 @@ defmodule DateTime do
15991599
end
16001600

16011601
naive_diff =
1602-
(datetime1 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(unit)) -
1603-
(datetime2 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(unit))
1602+
(datetime1 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(:microsecond)) -
1603+
(datetime2 |> to_iso_days() |> Calendar.ISO.iso_days_to_unit(:microsecond))
16041604

16051605
offset_diff = utc_offset2 + std_offset2 - (utc_offset1 + std_offset1)
1606-
naive_diff + System.convert_time_unit(offset_diff, :second, unit)
1606+
1607+
System.convert_time_unit(naive_diff, :microsecond, unit) +
1608+
System.convert_time_unit(offset_diff, :second, unit)
16071609
end
16081610

16091611
@doc """

lib/elixir/test/elixir/calendar/datetime_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,24 @@ defmodule DateTimeTest do
807807
# Test with a non-struct map conforming to Calendar.datetime
808808
assert DateTime.diff(Map.from_struct(dt1), Map.from_struct(dt2)) == 3_281_904_000
809809
end
810+
811+
test "diff with microseconds" do
812+
datetime = ~U[2023-02-01 10:30:10.123456Z]
813+
814+
in_almost_7_days =
815+
datetime
816+
|> DateTime.add(7, :day)
817+
|> DateTime.add(-1, :microsecond)
818+
819+
assert DateTime.diff(in_almost_7_days, datetime, :day) == 6
820+
end
821+
822+
test "diff in microseconds" do
823+
datetime1 = ~U[2023-02-01 10:30:10.000000Z]
824+
datetime2 = DateTime.add(datetime1, 1234, :microsecond)
825+
826+
assert DateTime.diff(datetime1, datetime2, :microsecond) == -1234
827+
end
810828
end
811829

812830
describe "from_naive" do

0 commit comments

Comments
 (0)