Delta T (ΔT)

Delta T (ΔT) is the difference between Terrestrial Dynamical Time (TD) and Universal Time (UT):

\[\Delta T = TD - UT\]

This correction is essential for accurate astronomical calculations because Earth's rotation rate is not constant. It varies due to tidal braking from the Moon, changes in Earth's moment of inertia, and other geophysical factors.

Implementation

SolarPosition.jl implements ΔT calculation using polynomial expressions fitted to historical observations and modern measurements from atomic clocks, based on [NAS25] and [MS04]:

  • Historical data (-500 to 1950): Based on eclipse observations
  • Modern era (1950-2005): Direct measurements from atomic clocks and radio observations
  • Future (2005-2050): Extrapolation based on recent trends
  • Far past/future: Parabolic extrapolation formula

Usage

SolarPosition.Positioning.calculate_deltatFunction
calculate_deltat(year::Real, month::Real) -> Any

Compute ΔT (Delta T), the difference between Terrestrial Dynamical Time (TD) and Universal Time (UT).

ΔT = TD - UT

This value is needed to convert between civil time (UT) and the uniform time scale used in astronomical calculations (TD). The value changes over time due to variations in Earth's rotation rate caused by tidal braking and other factors.

Arguments

  • year::Real: Calendar year (supports -1999 to 3000, with warnings outside this range)
  • month::Real: Month as a real number (1-12, fractional values supported for interpolation)

Returns

  • Float64: ΔT in seconds

Examples

julia> using SolarPosition.Positioning: calculate_deltat

julia> calculate_deltat(2020, 6)
71.85030032812497

julia> using Dates

julia> calculate_deltat(Date(2020, 6, 15))
71.87173085145835

julia> calculate_deltat(DateTime(2020, 6, 15, 12, 30))
71.87173085145835

Literature

The polynomial expressions for ΔT are from [NAS25], based on the work by [MS04].

source

Examples

Basic Usage

Calculate ΔT for a specific year and month:

using SolarPosition.Positioning: calculate_deltat

# Calculate ΔT for June 2020
dt = calculate_deltat(2020, 6)
println("ΔT ≈ $(round(dt, digits=2)) seconds")
ΔT ≈ 71.85 seconds

Using Date Objects

For more convenient usage with date objects:

using SolarPosition.Positioning: calculate_deltat
using Dates

# Using Date
date = Date(2020, 6, 15)
dt1 = calculate_deltat(date)

# Using DateTime
datetime = DateTime(2020, 6, 15, 12, 30, 45)
dt2 = calculate_deltat(datetime)

# Using ZonedDateTime
using TimeZones
zdt = ZonedDateTime(2020, 6, 15, 12, 30, 45, tz"UTC")
dt3 = calculate_deltat(zdt)

println("Date: ΔT ≈ $(round(dt1, digits=2)) seconds")
println("DateTime: ΔT ≈ $(round(dt2, digits=2)) seconds")
println("ZonedDateTime: ΔT ≈ $(round(dt3, digits=2)) seconds")
Date: ΔT ≈ 71.87 seconds
DateTime: ΔT ≈ 71.87 seconds
ZonedDateTime: ΔT ≈ 71.87 seconds

Historical Values

Calculate ΔT for historical dates:

using SolarPosition.Positioning: calculate_deltat

# Ancient Rome (year 0)
dt_ancient = calculate_deltat(0, 6)
println("Year 0: ΔT ≈ $(round(dt_ancient, digits=0)) seconds")

# Early telescope era (1650)
dt_1650 = calculate_deltat(1650, 6)
println("Year 1650: ΔT ≈ $(round(dt_1650, digits=1)) seconds")

# Near zero around 1900
dt_1900 = calculate_deltat(1900, 6)
println("Year 1900: ΔT ≈ $(round(dt_1900, digits=1)) seconds")
Year 0: ΔT ≈ 10579.0 seconds
Year 1650: ΔT ≈ 49.5 seconds
Year 1900: ΔT ≈ -2.1 seconds

Plotting Historical Trend

Visualize how ΔT has changed over time, similar to the measured values derived from telescopic observations:

using SolarPosition.Positioning: calculate_deltat
using CairoMakie

# Calculate ΔT for years 1600-2000 (historical measurements)
years = 1600:1:2000
deltat_values = [calculate_deltat(year, 6) for year in years]

# Create plot with transparent background
fig = Figure(size=(800, 500), backgroundcolor=:transparent, textcolor="#f5ab35")
ax = Axis(fig[1, 1],
    xlabel = "Year",
    ylabel = "ΔT (seconds)",
    title = "Historical Values of the Earth's Clock Error",
    backgroundcolor=:transparent,
    xgridvisible = false,
    ygridvisible = false,
    xticks = 1500:100:2000,
    xminorticks = IntervalsBetween(5),
    xminorticksvisible = true,
    yminorticks = IntervalsBetween(5),
    yminorticksvisible = true
)

# Plot the measured/calculated values
lines!(ax, years, deltat_values,
    linewidth=2.5,
    color=:steelblue,
    label="calculated"
)

# Add a very long-term parabolic trend line
# Using the formula: ΔT ≈ -20 + 32 * ((year - 1820) / 100)^2
# This represents the parabolic trend centered around 1820-1825
trend_years = 1560:10:2050
trend_values = [-20 + 32 * ((y - 1820) / 100)^2 for y in trend_years]
lines!(ax, trend_years, trend_values,
    linewidth=2,
    color=:steelblue,
    linestyle=:dash,
    label="very long-term trend"
)

axislegend(ax, position=:lb, backgroundcolor=:transparent)
xlims!(ax, 1500, 2000)
ylims!(ax, -50, 200)

fig
Example block output

This plot is an attempt to reproduce the result of [MS04, Fig 1., page 329] and shows the measured values of ΔT derived from astronomical observations since 1600 CE.

Accuracy

The accuracy of ΔT calculations varies depending on the time period:

  • Modern era (1950-2025): Very accurate (< 1 second)
  • Historical (1600-1950): Accurate to a few seconds
  • Medieval (500-1600): Accuracy decreases to ~10-30 seconds
  • Ancient (< 500): Accuracy decreases significantly (~50-500 seconds)
  • Future predictions: Uncertainty increases with time

The uncertainty in ΔT arises because Earth's rotation is affected by unpredictable factors like atmospheric circulation, ocean currents, and tectonic events. For more details on the polynomial expressions and methodology, see [NAS25] and [MS04].