Astrologers talk about the "Saturn return": the moment Saturn comes back to the same position it had in the sky when you were born. Whatever you think of astrology, the question underneath it is a clean astronomy problem: on which dates does Saturn return to a given ecliptic longitude?

I built a small browser calculator for it, and this post covers the part that surprised me: the obvious shortcut is wrong, and the correct answer sometimes has three dates instead of one.

The shortcut that does not work

Saturn's orbital period is about 29.46 years, so the obvious approach is:

const firstReturn = new Date(birth.getTime() + 29.46 * 365.2422 * 86400000); 

That gets you close, but not close enough. Saturn's orbit is slightly elliptical, so it moves faster in some parts of the zodiac and slower in others. When I computed the first return for people born at the edges of each of Saturn's sign periods, the age at the first return ranged from about 28.4 to 29.8 years. That is a spread of more than a year, so adding a constant gives you a date that can be wrong by months.

The approach that does work

Compute Saturn's actual ecliptic longitude for any date, then search for the dates where it equals your birth longitude. I used Astronomy Engine, which runs in the browser and in Node:

function longitude(date) { const t = Astronomy.MakeTime(date); const v = Astronomy.GeoVector(Astronomy.Body.Saturn, t, true); // true = correct for light travel time return Astronomy.Ecliptic(v).elon; // degrees, 0 to 360 } 

One thing to check with any library: the zodiac signs used in Western astrology are measured from the March equinox of the date, so make sure you are getting ecliptic longitude of date, not of a fixed epoch like J2000. I check against a published table before trusting any result.

The retrograde problem

Seen from Earth, Saturn spends about four and a half months of every year moving backwards against the stars. If your natal degree happens to sit where one of those loops falls, Saturn crosses it three times: forward, back, then forward again. So "the date of the return" is not always one date.

The search therefore has to find all crossings in a window, not just the first one. I scan in two-day steps, look for a sign change in the signed angular difference, and then bisect to refine each crossing:

// signed difference between two longitudes, in the range -180..180 const angDiff = (a, b) => ((a - b + 540) % 360) - 180; function crossings(target, from, to) { const step = 2 * 86400000; const out = []; let d0 = angDiff(longitude(new Date(from)), target); for (let t = from + step; t <= to + step; t += step) { const d1 = angDiff(longitude(new Date(t)), target); // ignore wrap-around jumps near +/-180 if (Math.abs(d0) < 90 && Math.abs(d1) < 90 && Math.sign(d0) !== Math.sign(d1)) { let lo = t - step, hi = t; for (let i = 0; i < 40; i++) { // bisection const mid = (lo + hi) / 2; const dm = angDiff(longitude(new Date(mid)), target); if (Math.sign(dm) === Math.sign(d0)) lo = mid; else hi = mid; } out.push(new Date((lo + hi) / 2)); } d0 = d1; } return out; } 

(This is a simplified version of what the calculator does.) The first return is then crossings(natalLongitude, birth + 26 years, birth + 32 years), the second in a window around 55 to 63 years, and the third around 84 to 92. Searching a wide window and letting the crossings fall out is much safer than guessing a date.

What the result looks like

For most people the window holds a single crossing. For some it holds three. Someone born on 10 January 1990, for example, gets crossings on 17 February, 16 July and 17 November 2019, while someone born on 15 June 1994 gets a single one, on 21 March 2024. That spread is why the Saturn return is described as lasting a period rather than a day.

I turned the calculation into a lookup too. Saturn return by birth year lists the natal Saturn sign and the first-return window for birth dates from late 1929 to 2012, and the Saturn return calculator gives the exact dates for your own birth date, all in the browser with no data sent anywhere.

Notes

  • The positions are an astronomical calculation. What a Saturn return means is astrological tradition, not science; I treat that part as entertainment.
  • I checked the code against known sign changes (for example Saturn entering Pisces in March 2023) before trusting it.
  • If you build something similar, test dates near sign boundaries and dates when Saturn is retrograde. Those are where the bugs hide.

If you try it and find a date that looks wrong, I would like to hear about it in the comments.