Răsfoiți Sursa

Fix _jd_to_utc_datetime: clamp second/minute to valid range

- Floating-point precision in swe.revjul + round() can produce second=60
  which raises ValueError('second must be in 0..59')
- Clamp second to 0..59 and carry over to minute/hour as needed
- Root cause of 'Error executing tool get_lunar_state: second must be in 0..59'
  for dates where the binary search in _refine_phase_transition produced
  JD values with precision edge cases
Lukas Goldschmidt 1 lună în urmă
părinte
comite
04796386b9
1 a modificat fișierele cu 8 adăugiri și 0 ștergeri
  1. 8 0
      src/ephemeris_mcp/ephemeris.py

+ 8 - 0
src/ephemeris_mcp/ephemeris.py

@@ -592,6 +592,14 @@ def _jd_to_utc_datetime(jd: float) -> datetime:
     minute_float = (h - hour) * 60.0
     minute = int(minute_float)
     second = int(round((minute_float - minute) * 60.0))
+    # Clamp second to valid range (0..59) to avoid ValueError from
+    # floating-point precision issues in the JD conversion
+    if second >= 60:
+        second = 0
+        minute += 1
+    if minute >= 60:
+        minute = 0
+        hour += 1
     return datetime(y, m, d, hour, minute, second, tzinfo=timezone.utc)