Skip to content

Commit 7638bc8

Browse files
committed
Optimize from_gregorian_seconds
1 parent 19d3aee commit 7638bc8

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

lib/elixir/lib/calendar/iso.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,6 +1772,15 @@ defmodule Calendar.ISO do
17721772
{days, day_fraction}
17731773
end
17741774

1775+
@doc false
1776+
def gregorian_seconds_to_naive_datetime(seconds, microsecond) do
1777+
{days, seconds} = div_rem(seconds, @seconds_per_day)
1778+
{hours, seconds} = div_rem(seconds, @seconds_per_hour)
1779+
{minutes, seconds} = div_rem(seconds, @seconds_per_minute)
1780+
{year, month, day} = date_from_iso_days(days)
1781+
{year, month, day, hours, minutes, seconds, {microsecond, 6}}
1782+
end
1783+
17751784
@doc false
17761785
def iso_days_to_unit({days, {parts, ppd}}, unit) do
17771786
day_microseconds = days * @parts_per_day

lib/elixir/lib/calendar/naive_datetime.ex

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,10 +1058,16 @@ defmodule NaiveDateTime do
10581058
calendar \\ Calendar.ISO
10591059
)
10601060
when is_integer(seconds) do
1061-
iso_days = Calendar.ISO.gregorian_seconds_to_iso_days(seconds, microsecond)
1062-
10631061
{year, month, day, hour, minute, second, {microsecond, _}} =
1064-
calendar.naive_datetime_from_iso_days(iso_days)
1062+
case calendar do
1063+
Calendar.ISO ->
1064+
# Optimized version that skips unnecessary iso days conversion
1065+
Calendar.ISO.gregorian_seconds_to_naive_datetime(seconds, microsecond)
1066+
1067+
_ ->
1068+
iso_days = Calendar.ISO.gregorian_seconds_to_iso_days(seconds, microsecond)
1069+
calendar.naive_datetime_from_iso_days(iso_days)
1070+
end
10651071

10661072
%NaiveDateTime{
10671073
calendar: calendar,

0 commit comments

Comments
 (0)