CITE THIS NOTEBOOK: What is the winter solstice? by Jose Martin-Garcia. Wolfram Community Dec 21 2022.
This year 2022 the winter solstice happens today December 21st, at 21:48 GMT in the UTC time system. We frequently find explanations associating the winter solstice to the shortest day of the year. This only defines a day of the year, not an instant. How is that instant defined? The new Astro functionality in version 13.2 of the Wolfram Language allows us to define and find the solstice instant with high precision.
Traditionally, the defining event for the winter solstice is that the Sun reaches its lowest value of declination in the year. Declination is the latitude value of the spherical coordinate system associated to the equatorial frame. In other words, it is the angular distance from the Sun to the projection of Earth’s equator on the celestial sphere. Its current value as I write this post is:
AstroPosition
Sun
STAR
,"Equatorial"["Declination"]
-23.4379
Define a function for the declination of the Sun:
sunDeclination[date_?DateObjectQ]:=AstroPosition
Sun
STAR
,{"Equatorial",date}["Declination"]
This is how it changed throughout year 2022:
DateListPlotTable{date,sunDeclination[date]},date,DateRange
Sat 1 Jan 2022
,
Sun 1 Jan 2023

FindMinimum[sunDeclination[DateObject[{2022,12,21,0,0,s},TimeZone->0]],{s,0,86400}]
{-23.4381,{s78754.2}}
DateObject[{2022,12,21,0,0,s/.Last[%]},TimeZone->0]
Wed 21 Dec 2022 21:52:34GMT
Finding a minimum with high precision is difficult, because the curve is nearly flat around the minimum, so a different definition is used in astronomical almanacs: the ecliptic longitude of the Sun is 270 degrees. We can compute it with AstroPosition, again for the current instant as I write this post:
AstroPosition
Sun
STAR
,"Ecliptic"["Longitude"]
269.733
As before, define a function and compute it for year 2022:
sunLongitude[date_?DateObjectQ]:=AstroPosition
Sun
STAR
,{"Ecliptic",date}["Longitude"]
DateListPlotTable{date,sunLongitude[date]},date,DateRange
Sat 1 Jan 2022
,
Sun 1 Jan 2023

When this function takes values 0, 90, 180 and 270 degrees we have spring equinox, summer solstice, autumn equinox and winter solstice, respectively. The exact instant of the winter solstice can be found with FindRoot:
FindRoot[sunLongitude[DateObject[{2022,12,21,0,0,s},TimeZone->0]]-270,{s,0,86400}]
{s78493.}
DateObject[{2022,12,21,0,0,s/.Last[%]},TimeZone->0]
Wed 21 Dec 2022 21:48:13GMT
This is the value quoted in the astronomical almanacs, and we see that it differs by several minutes from the value computed using solar declination.
These computations take into account various effects, for example the fact that light from the Sun takes more than 8 minutes to reach us, or light aberration due to the motion of the Earth around the Sun. There is also freedom of choice of true equatorial/ecliptic coordinates, taking nutation into account (which is what we choose by default), or mean coordinates averaging over nutation. We could also discuss which time system is selected (UTC is our default), independently of the time zones. This is all automatically taken care of by AstroPosition, and will be discussed in detail in future posts about the new Astro functionality.