From 69c877b508aff8529686f23bdb720129c343f441 Mon Sep 17 00:00:00 2001 From: preciz Date: Sun, 20 Sep 2026 15:07:42 +0200 Subject: [PATCH] Optimize UTC-offset adjustment in Calendar.ISO parsing Normalize nonzero UTC offsets directly in seconds and reuse seconds_to_time/1, avoiding intermediate day-fraction conversions while preserving parsed microseconds and precision. Assisted-by: Codex:GPT-6 --- lib/elixir/lib/calendar/iso.ex | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/elixir/lib/calendar/iso.ex b/lib/elixir/lib/calendar/iso.ex index 69f8e069711..8b316c20a1e 100644 --- a/lib/elixir/lib/calendar/iso.ex +++ b/lib/elixir/lib/calendar/iso.ex @@ -673,18 +673,21 @@ defmodule Calendar.ISO do {:error, :missing_offset} true -> - day_fraction = time_to_day_fraction(hour, minute, second, {0, 0}) + seconds = hour * @seconds_per_hour + minute * @seconds_per_minute + second - offset + {extra_days, seconds} = div_rem(seconds, @seconds_per_day) - {{year, month, day}, {hour, minute, second, _}} = - case add_time_unit_to_iso_days({0, day_fraction}, -offset, :second) do - {0, day_fraction} -> - {{year, month, day}, time_from_day_fraction(day_fraction)} + {year, month, day} = + case extra_days do + 0 -> + {year, month, day} - {extra_days, day_fraction} -> + _ -> base_days = valid_date_to_iso_days(year, month, day) - {date_from_iso_days(base_days + extra_days), time_from_day_fraction(day_fraction)} + date_from_iso_days(base_days + extra_days) end + {hour, minute, second} = seconds_to_time(seconds) + {:ok, {year, month, day, hour, minute, second, microsecond}, offset} end else