What this page is
This is a lab-style display of time across the solar system. It’s meant to make the core ideas feel tangible without requiring a physics textbook.
Earth Local Time is your reference clock.
Relativistic planetary & lunar clocks
A friendly guide to what the clocks mean.
This is a lab-style display of time across the solar system. It’s meant to make the core ideas feel tangible without requiring a physics textbook.
Earth Local Time is your reference clock.
| Label | What it means | Common confusion |
|---|---|---|
| Earth Local Time | The reference clock for the observer site and time zone you set. | It is not UTC unless your Time Zone ID is UTC. |
| Reference clock for the observatory site | The subtitle for Earth Local Time, reiterating that everything is relative to your observer site. | It does not imply a physical observatory—just your chosen coordinates. |
| Observer shift on (…°) | Shows the Earth longitude shift currently applied to the snapshot. | This appears only when the longitude shift option is enabled. |
| Solar System Clocks | The list of per-body clocks in the grid. | These clocks are not synchronized to Earth time; they each show local solar time. |
| Local solar time and relativistic rate offsets | The subtitle explaining that each card shows local solar time plus a rate offset. | “Local solar time” is not the same as civil time or time zones. |
| Planets | Filter to show only planetary bodies in the grid. | Planets include Earth; use the filter to hide them if you want moons only. |
| Moons | Filter to show only moons in the grid. | Moons are grouped under Jovian or Saturnian in the other filters. |
| Inner planets | Filter for Mercury, Venus, Earth, and Mars. | This is a subset of Planets; both must be enabled to see them. |
| Outer planets | Filter for gas giants and ice giants. | This is a subset of Planets; both must be enabled to see them. |
| Jovian moons | Filter for moons that orbit Jupiter. | Only applies when Moons is enabled. |
| Saturnian moons | Filter for moons that orbit Saturn. | Only applies when Moons is enabled. |
| ppb vs Earth site | Rate offset for that body relative to your Earth site, in parts per billion. | This is a rate difference, not a time difference or an absolute clock speed. |
| Observer Settings | Panel where you set the observer site used to compute the snapshot. | Changes here affect the reference clock and the per-body offsets. |
| Configure site coordinates and local time zone | The subtitle for Observer Settings, describing what the form controls. | This is descriptive text, not an extra setting. |
| Latitude (°) | Observer site latitude in degrees. | North is positive, south is negative. |
| Longitude (°) | Observer site longitude in degrees. | East is positive, west is negative. |
| Altitude (m) | Observer site altitude above mean sea level, in meters. | This is not a radius; it is height relative to sea level. |
| Time Zone ID | IANA time zone name used for Earth Local Time (e.g., America/Denver). | This is not a UTC offset string like “-07:00.” |
| Shift planetary clocks with my Earth longitude | If enabled, the snapshot uses your Earth longitude to align local solar time. | It shifts the reference for solar time, not the rate offsets. |
| Use Current Defaults | Resets the form to the current site settings. | It does not apply changes until you click Apply. |
| Apply | Submits observer settings and refreshes the snapshot. | This is when the snapshot is recomputed. |
| Observer settings applied. | Confirmation that the new observer settings were saved and used. | The snapshot has been recomputed even if the clocks look similar. |
| Loading planetary clocks… | The initial snapshot is being fetched. | It is a loading state, not an error. |
| Awaiting ephemeris snapshot… | Waiting for the next PlanetaryTimeSnapshot from the server. | This is normal while data is loading or refreshing. |
Time is not universal. Local solar time differs by planet because of rotation and where the Sun is in that body’s sky.
Clocks don’t tick at exactly the same rate everywhere. The ppb vs Earth site label shows how much faster or slower a body runs relative to your Earth site.
So what? It means every clock is valid in its own context, and the UI shows how they relate.
The public API is read-only and returns JSON. Use the GET /api/clock/snapshot endpoint with
query string parameters that match the observer settings form.
Example request message:
GET /api/clock/snapshot?lat=39.7392&lon=-104.9903&alt=1609.3&tz=America/Denver&time=2024-04-19T12:30:00&shiftWithObserverLongitude=true HTTP/1.1
Host: your-hostname
Accept: application/json
Example response payload (truncated):
{
"earthLocalTime": "2024-04-19T12:30:00-06:00",
"snapshotUtc": "2024-04-19T18:30:00Z",
"isObserverLongitudeShiftApplied": true,
"observerLongitudeDeg": -104.9903,
"bodies": [
{
"bodyId": "earth",
"displayName": "Earth",
"localSolarTicks": 558000000000,
"dailyRateOffsetPpb": 0.0,
"category": "Planet",
"group": "Inner"
},
{
"bodyId": "mars",
"displayName": "Mars",
"localSolarTicks": 1123200000000,
"dailyRateOffsetPpb": -12.3,
"category": "Planet",
"group": "Inner"
}
]
}
Tip: you can omit time to use the server’s current local civil time, and omit location parameters
to fall back to the configured default site.
It is your local civil time at the selected Earth site and time zone. Internally, the app converts your local civil time to UTC and then to TT before the PlanetaryClockEngine computes the snapshot.
Think of it as “where the Sun is” on that world. Noon-ish is when the Sun is highest in the sky for that location on the planet or moon.
It can feel unintuitive versus your watch because a planet’s rotation rate and day length can be very different from Earth’s.
You’re changing the observer site (latitude, longitude, and Time Zone ID). That affects the reference clock and some geometry assumptions used to align the snapshot with “your” perspective.
Ppb means parts per billion. It is a rate difference, showing how much faster or slower a body runs compared to your Earth site per day.
Example: +10 ppb is about +0.00000001 seconds per second, which adds up to roughly 0.864 milliseconds over a day.
This value is relative to your observer site, not an absolute rate. The engine computes body rate minus observer rate.
The UI renders smoothly, but it refreshes from periodic snapshots. That can introduce tiny jumps when a new snapshot arrives.
There is caching and interpolation under the hood to keep updates fast and consistent while the app stays responsive.
Time Zone ID only changes how Earth Local Time is labeled and displayed. The snapshot is still computed by converting your local civil time to UTC and then to TT before calculating the rest of the system. That means other bodies keep the same underlying snapshot and you’re just viewing it through a different local time zone.
Earth local solar time is based on geometry (where the Sun is relative to your longitude), while your wall clock is civil time with time zones, leap seconds, and UTC offsets baked in. Those are different standards, so the minutes can drift or look offset even when the date is the same.
The UI projects forward between snapshots for smoothness, then clamps to the next server snapshot when it arrives. If the new snapshot would put the display behind what you were just seeing, the UI nudges it forward. If you notice a tiny back-step, it usually means the latest snapshot arrived slightly behind the projected display due to network or timing jitter.
Each body’s local solar time is computed from its rotation rate and geometry. Some planets and moons rotate very slowly or even retrograde, so their “days” look nothing like Earth. This is expected and reflects how their local solar time is modeled.
Ppb is a rate difference relative to your Earth site. A negative value means the body’s clock runs slower than your Earth site, so it loses time compared to Earth over a day.
It is a model. The engine uses simplified ephemeris and rotation strategies to make the trends understandable and fast. Improving the fidelity would mean swapping in higher-precision ephemerides and rotation models, which would tighten the alignment with authoritative astronomical data.
This engine is deterministic and configuration-driven.
Some models are intentionally simplified right now. For example, the SimpleKeplerianEphemerisProvider uses a circular-orbit approximation and the SimpleBodyRotationModel makes simplified rotation-axis assumptions.
So what? The trends are trustworthy even when the fine details are intentionally compact.
If you enter a location, we only use latitude, longitude, and time zone to compute the current snapshot. The data stays in the app and is not shared elsewhere.
A quick summary of the conversion chain and what the engine reports: