Chinese Calendar Algorithm - Year 1901 to 2100 - v4.15, by Herong Yang
Equinoxes, Solstices and Seasons
This section describes Equinoxes, Solstices and Seasons, which are based on the tropical year.
Since the Gregorian calendar year is an approximation of the tropical year, we usually mark the following 4 moments of the tropical year in the the Gregorian calendar to show approximation differences.
The diagram below shows you Sun positions on Equinoxes and Solstices, relative to the Ecliptic Plane and the Equator Plane:
Fred Espenak has presented table of date and time (Greenwich Mean Time) of all Equinoxes and Solstices for the 21st Century (2001-2100) at http://astropixels.com/ephemeris/soleq2001.html. Here are a few example lines from the table:
Solstices and Equinoxes: 2001 to 2050 Greenwich Mean Time (GMT) Year Spring Equinox Summer Solstice Fall Equinox Winter Solstice 2001 Mar 20 13:31 Jun 21 07:38 Sep 22 23:05 Dec 21 19:22 2002 Mar 20 19:16 Jun 21 13:25 Sep 23 04:56 Dec 22 01:15 2003 Mar 21 01:00 Jun 21 19:11 Sep 23 10:47 Dec 22 07:04 2004 Mar 20 06:49 Jun 21 00:57 Sep 22 16:30 Dec 21 12:42 2005 Mar 20 12:34 Jun 21 06:46 Sep 22 22:23 Dec 21 18:35 ... 2051 Mar 20 15:58 Jun 21 09:17 Sep 23 01:26 Dec 21 22:33 2052 Mar 19 21:56 Jun 20 15:16 Sep 22 07:16 Dec 21 04:18 2053 Mar 20 03:46 Jun 20 21:03 Sep 22 13:05 Dec 21 10:09 2054 Mar 20 09:35 Jun 21 02:47 Sep 22 19:00 Dec 21 16:10 2055 Mar 20 15:28 Jun 21 08:39 Sep 23 00:48 Dec 21 21:56 ... 2096 Mar 19 14:03 Jun 20 06:31 Sep 21 22:55 Dec 20 20:46 2097 Mar 19 19:49 Jun 20 12:14 Sep 22 04:37 Dec 21 02:38 2098 Mar 20 01:38 Jun 20 18:01 Sep 22 10:22 Dec 21 08:19 2099 Mar 20 07:17 Jun 20 23:41 Sep 22 16:10 Dec 21 14:04 2100 Mar 20 13:04 Jun 21 05:32 Sep 22 22:00 Dec 21 19:51
By the way, there is no easy ways to calculate Equinoxes and Solstices. The main reason is that the length of a tropical year is not a constant (due to a number of factors) and can vary up to 30 minutes. We can only observe them and predict Equinoxes and Solstices with approximations.
Also note that the earth orbit is not a circle, you can not divide a tropical year equally into 4 parts to determine Equinox and Solstice dates and times.
Here is simple Perl script that reads the Equinox/Solstice data for the 21st Century and verify their intervals.
#- Equinoxes-and-Solstices.pl #- Copyright (c) 2003 HerongYang.com, All Rights Reserved. use Date::Parse; use Date::Format; use Math::Round; $meanYear = 365.2421896698 * 24 * 60 * 60; $meanHalf = round($meanYear/2); $meanQuarter = round($meanYear/4); @equinoxesAndSolstices = (); loadData(); verifyData(); exit; sub verifyData { $l = @equinoxesAndSolstices; for ($i=4; $i<$l; $i++) { my $t = @equinoxesAndSolstices[$i]; my $g = time2str("%Y-%m-%d %H:%M:%S %Z", $t, "GMT"); my $z = time2str("%Y-%m-%d %H:%M:%S %Z", $t, "WST"); print("GMT=$g, WST=$z\n"); my $year = $t - @equinoxesAndSolstices[$i-4]; my $half = $t - @equinoxesAndSolstices[$i-2]; my $quarter = $t - @equinoxesAndSolstices[$i-1]; my $diffYear = $year - $meanYear; my $diffHalf = $half - $meanHalf; my $diffQuarter = $quarter - $meanQuarter; print(" Year Mean=$meanYear, This Year=$year, Diff=" .round($diffYear/60)." minutes\n"); print(" Half Mean=$meanHalf, This Half=$half, Diff=" .round($diffHalf/60/60)." hours\n"); print(" Quarter Mean=$meanQuarter, This Quarter=$quarter, Diff=" .round($diffQuarter/60/60)." hours\n"); } } sub loadData { $data = << "EOD"; 2001= 20 13:31, 21 07:38, 22 23:05, 21 19:22 2002= 20 19:16, 21 13:25, 23 04:56, 22 01:15 2003= 21 01:00, 21 19:11, 23 10:47, 22 07:04 2004= 20 06:49, 21 00:57, 22 16:30, 21 12:42 2005= 20 12:34, 21 06:46, 22 22:23, 21 18:35 2006= 20 18:25, 21 12:26, 23 04:04, 22 00:22 2007= 21 00:07, 21 18:06, 23 09:51, 22 06:08 2008= 20 05:49, 21 00:00, 22 15:45, 21 12:04 2009= 20 11:44, 21 05:45, 22 21:18, 21 17:47 2010= 20 17:32, 21 11:28, 23 03:09, 21 23:38 2011= 20 23:21, 21 17:16, 23 09:05, 22 05:30 2012= 20 05:15, 20 23:08, 22 14:49, 21 11:12 2013= 20 11:02, 21 05:04, 22 20:44, 21 17:11 2014= 20 16:57, 21 10:52, 23 02:30, 21 23:03 2015= 20 22:45, 21 16:38, 23 08:20, 22 04:48 2016= 20 04:31, 20 22:35, 22 14:21, 21 10:45 2017= 20 10:29, 21 04:25, 22 20:02, 21 16:29 2018= 20 16:15, 21 10:07, 23 01:54, 21 22:22 2019= 20 21:58, 21 15:54, 23 07:50, 22 04:19 2020= 20 03:50, 20 21:43, 22 13:31, 21 10:03 2021= 20 09:37, 21 03:32, 22 19:21, 21 15:59 2022= 20 15:33, 21 09:14, 23 01:04, 21 21:48 2023= 20 21:25, 21 14:58, 23 06:50, 22 03:28 2024= 20 03:07, 20 20:51, 22 12:44, 21 09:20 2025= 20 09:02, 21 02:42, 22 18:20, 21 15:03 2026= 20 14:46, 21 08:25, 23 00:06, 21 20:50 2027= 20 20:25, 21 14:11, 23 06:02, 22 02:43 2028= 20 02:17, 20 20:02, 22 11:45, 21 08:20 2029= 20 08:01, 21 01:48, 22 17:37, 21 14:14 2030= 20 13:51, 21 07:31, 22 23:27, 21 20:09 2031= 20 19:41, 21 13:17, 23 05:15, 22 01:56 2032= 20 01:23, 20 19:09, 22 11:11, 21 07:57 2033= 20 07:23, 21 01:01, 22 16:52, 21 13:45 2034= 20 13:18, 21 06:45, 22 22:41, 21 19:35 2035= 20 19:03, 21 12:33, 23 04:39, 22 01:31 2036= 20 01:02, 20 18:31, 22 10:23, 21 07:12 2037= 20 06:50, 21 00:22, 22 16:13, 21 13:08 2038= 20 12:40, 21 06:09, 22 22:02, 21 19:01 2039= 20 18:32, 21 11:58, 23 03:50, 22 00:41 2040= 20 00:11, 20 17:46, 22 09:44, 21 06:33 2041= 20 06:07, 20 23:37, 22 15:27, 21 12:19 2042= 20 11:53, 21 05:16, 22 21:11, 21 18:04 2043= 20 17:29, 21 10:59, 23 03:07, 22 00:02 2044= 19 23:20, 20 16:50, 22 08:47, 21 05:43 2045= 20 05:08, 20 22:34, 22 14:33, 21 11:36 2046= 20 10:58, 21 04:15, 22 20:22, 21 17:28 2047= 20 16:52, 21 10:02, 23 02:07, 21 23:07 2048= 19 22:34, 20 15:54, 22 08:01, 21 05:02 2049= 20 04:28, 20 21:47, 22 13:42, 21 10:51 2050= 20 10:20, 21 03:33, 22 19:29, 21 16:39 2051= 20 15:58, 21 09:17, 23 01:26, 21 22:33 2052= 19 21:56, 20 15:16, 22 07:16, 21 04:18 2053= 20 03:46, 20 21:03, 22 13:05, 21 10:09 2054= 20 09:35, 21 02:47, 22 19:00, 21 16:10 2055= 20 15:28, 21 08:39, 23 00:48, 21 21:56 2056= 19 21:11, 20 14:29, 22 06:40, 21 03:52 2057= 20 03:08, 20 20:19, 22 12:23, 21 09:42 2058= 20 09:04, 21 02:03, 22 18:07, 21 15:24 2059= 20 14:44, 21 07:47, 23 00:03, 21 21:18 2060= 19 20:37, 20 13:44, 22 05:47, 21 03:00 2061= 20 02:26, 20 19:33, 22 11:31, 21 08:49 2062= 20 08:07, 21 01:10, 22 17:19, 21 14:42 2063= 20 13:59, 21 07:02, 22 23:08, 21 20:22 2064= 19 19:40, 20 12:47, 22 04:58, 21 02:10 2065= 20 01:27, 20 18:31, 22 10:41, 21 07:59 2066= 20 07:19, 21 00:16, 22 16:27, 21 13:45 2067= 20 12:55, 21 05:56, 22 22:20, 21 19:44 2068= 19 18:51, 20 11:55, 22 04:09, 21 01:34 2069= 20 00:44, 20 17:40, 22 09:51, 21 07:21 2070= 20 06:35, 20 23:22, 22 15:45, 21 13:19 2071= 20 12:36, 21 05:21, 22 21:39, 21 19:05 2072= 19 18:19, 20 11:12, 22 03:26, 21 00:54 2073= 20 00:12, 20 17:06, 22 09:14, 21 06:50 2074= 20 06:09, 20 22:59, 22 15:04, 21 12:36 2075= 20 11:48, 21 04:41, 22 21:00, 21 18:28 2076= 19 17:37, 20 10:35, 22 02:48, 21 00:12 2077= 19 23:30, 20 16:23, 22 08:35, 21 06:00 2078= 20 05:11, 20 21:58, 22 14:25, 21 11:59 2079= 20 11:03, 21 03:51, 22 20:15, 21 17:46 2080= 19 16:43, 20 09:33, 22 01:55, 20 23:31 2081= 19 22:34, 20 15:16, 22 07:38, 21 05:22 2082= 20 04:32, 20 21:04, 22 13:24, 21 11:06 2083= 20 10:08, 21 02:41, 22 19:10, 21 16:51 2084= 19 15:58, 20 08:39, 22 00:58, 20 22:40 2085= 19 21:53, 20 14:33, 22 06:43, 21 04:29 2086= 20 03:36, 20 20:11, 22 12:33, 21 10:24 2087= 20 09:27, 21 02:05, 22 18:27, 21 16:07 2088= 19 15:16, 20 07:57, 22 00:18, 20 21:56 2089= 19 21:07, 20 13:43, 22 06:07, 21 03:53 2090= 20 03:03, 20 19:37, 22 12:01, 21 09:45 2091= 20 08:40, 21 01:17, 22 17:49, 21 15:37 2092= 19 14:33, 20 07:14, 21 23:41, 20 21:31 2093= 19 20:35, 20 13:08, 22 05:30, 21 03:21 2094= 20 02:20, 20 18:40, 22 11:15, 21 09:11 2095= 20 08:14, 21 00:38, 22 17:10, 21 15:00 2096= 19 14:03, 20 06:31, 21 22:55, 20 20:46 2097= 19 19:49, 20 12:14, 22 04:37, 21 02:38 2098= 20 01:38, 20 18:01, 22 10:22, 21 08:19 2099= 20 07:17, 20 23:41, 22 16:10, 21 14:04 2100= 20 13:04, 21 05:32, 22 22:00, 21 19:51 EOD my @lines = split(/\n/, $data); foreach (@lines) { my ($year, $rest) = split(/=/, $_); my @tokens = split(/,/, $rest); if ($rest =~ /^ *([^,]+), *([^,]+), *([^,]+), *(.+) *$/s) { my $s1 = "$year-03-$1:00 GMT"; my $s2 = "$year-06-$2:00 GMT"; my $s3 = "$year-09-$3:00 GMT"; my $s4 = "$year-12-$4:00 GMT"; # print("$s1, $s2, $s3, $s4\n"); my $t1 = str2time($s1); my $t2 = str2time($s2); my $t3 = str2time($s3); my $t4 = str2time($s4); # print("$t1, $t2, $t3, $t4\n"); push(@equinoxesAndSolstices, ($t1, $t2, $t3, $t4)); } } }
If you run the above script, you will get:
herong> perl Equinoxes-and-Solstices.pl GMT=2002-03-20 19:16:00 GMT, WST=2002-03-21 03:16:00 WST Year Mean=31556925.1874707, This Year=31556700, Diff=-4 minutes Half Mean=15778463, This Half=15451860, Diff=-91 hours Quarter Mean=7889231, This Quarter=7689240, Diff=-56 hours GMT=2002-06-21 13:25:00 GMT, WST=2002-06-21 21:25:00 WST Year Mean=31556925.1874707, This Year=31556820, Diff=-2 minutes Half Mean=15778463, This Half=15703380, Diff=-21 hours Quarter Mean=7889231, This Quarter=8014140, Diff=35 hours GMT=2002-09-23 04:56:00 GMT, WST=2002-09-23 12:56:00 WST Year Mean=31556925.1874707, This Year=31557060, Diff=2 minutes Half Mean=15778463, This Half=16105200, Diff=91 hours Quarter Mean=7889231, This Quarter=8091060, Diff=56 hours GMT=2002-12-22 01:15:00 GMT, WST=2002-12-22 09:15:00 WST Year Mean=31556925.1874707, This Year=31557180, Diff=4 minutes Half Mean=15778463, This Half=15853800, Diff=21 hours Quarter Mean=7889231, This Quarter=7762740, Diff=-35 hours GMT=2003-03-21 01:00:00 GMT, WST=2003-03-21 09:00:00 WST Year Mean=31556925.1874707, This Year=31556640, Diff=-5 minutes Half Mean=15778463, This Half=15451440, Diff=-91 hours Quarter Mean=7889231, This Quarter=7688700, Diff=-56 hours GMT=2003-06-21 19:11:00 GMT, WST=2003-06-22 03:11:00 WST Year Mean=31556925.1874707, This Year=31556760, Diff=-3 minutes Half Mean=15778463, This Half=15702960, Diff=-21 hours Quarter Mean=7889231, This Quarter=8014260, Diff=35 hours GMT=2003-09-23 10:47:00 GMT, WST=2003-09-23 18:47:00 WST Year Mean=31556925.1874707, This Year=31557060, Diff=2 minutes Half Mean=15778463, This Half=16105620, Diff=91 hours Quarter Mean=7889231, This Quarter=8091360, Diff=56 hours GMT=2003-12-22 07:04:00 GMT, WST=2003-12-22 15:04:00 WST Year Mean=31556925.1874707, This Year=31556940, Diff=0 minutes Half Mean=15778463, This Half=15853980, Diff=21 hours Quarter Mean=7889231, This Quarter=7762620, Diff=-35 hours GMT=2004-03-20 06:49:00 GMT, WST=2004-03-20 14:49:00 WST Year Mean=31556925.1874707, This Year=31556940, Diff=0 minutes Half Mean=15778463, This Half=15451320, Diff=-91 hours Quarter Mean=7889231, This Quarter=7688700, Diff=-56 hours GMT=2004-06-21 00:57:00 GMT, WST=2004-06-21 08:57:00 WST Year Mean=31556925.1874707, This Year=31556760, Diff=-3 minutes Half Mean=15778463, This Half=15702780, Diff=-21 hours Quarter Mean=7889231, This Quarter=8014080, Diff=35 hours GMT=2004-09-22 16:30:00 GMT, WST=2004-09-23 00:30:00 WST Year Mean=31556925.1874707, This Year=31556580, Diff=-6 minutes Half Mean=15778463, This Half=16105260, Diff=91 hours Quarter Mean=7889231, This Quarter=8091180, Diff=56 hours GMT=2004-12-21 12:42:00 GMT, WST=2004-12-21 20:42:00 WST Year Mean=31556925.1874707, This Year=31556280, Diff=-11 minutes Half Mean=15778463, This Half=15853500, Diff=21 hours Quarter Mean=7889231, This Quarter=7762320, Diff=-35 hours ... GMT=2099-03-20 07:17:00 GMT, WST=2099-03-20 15:17:00 WST Year Mean=31556925.1874707, This Year=31556340, Diff=-10 minutes Half Mean=15778463, This Half=15454500, Diff=-90 hours Quarter Mean=7889231, This Quarter=7685880, Diff=-56 hours GMT=2099-06-20 23:41:00 GMT, WST=2099-06-21 07:41:00 WST Year Mean=31556925.1874707, This Year=31556400, Diff=-9 minutes Half Mean=15778463, This Half=15693720, Diff=-24 hours Quarter Mean=7889231, This Quarter=8007840, Diff=33 hours GMT=2099-09-22 16:10:00 GMT, WST=2099-09-23 00:10:00 WST Year Mean=31556925.1874707, This Year=31556880, Diff=-1 minutes Half Mean=15778463, This Half=16102380, Diff=90 hours Quarter Mean=7889231, This Quarter=8094540, Diff=57 hours GMT=2099-12-21 14:04:00 GMT, WST=2099-12-21 22:04:00 WST Year Mean=31556925.1874707, This Year=31556700, Diff=-4 minutes Half Mean=15778463, This Half=15862980, Diff=23 hours Quarter Mean=7889231, This Quarter=7768440, Diff=-34 hours GMT=2100-03-20 13:04:00 GMT, WST=2100-03-20 21:04:00 WST Year Mean=31556925.1874707, This Year=31556820, Diff=-2 minutes Half Mean=15778463, This Half=15454440, Diff=-90 hours Quarter Mean=7889231, This Quarter=7686000, Diff=-56 hours GMT=2100-06-21 05:32:00 GMT, WST=2100-06-21 13:32:00 WST Year Mean=31556925.1874707, This Year=31557060, Diff=2 minutes Half Mean=15778463, This Half=15694080, Diff=-23 hours Quarter Mean=7889231, This Quarter=8008080, Diff=33 hours GMT=2100-09-22 22:00:00 GMT, WST=2100-09-23 06:00:00 WST Year Mean=31556925.1874707, This Year=31557000, Diff=1 minutes Half Mean=15778463, This Half=16102560, Diff=90 hours Quarter Mean=7889231, This Quarter=8094480, Diff=57 hours GMT=2100-12-21 19:51:00 GMT, WST=2100-12-22 03:51:00 WST Year Mean=31556925.1874707, This Year=31556820, Diff=-2 minutes Half Mean=15778463, This Half=15862740, Diff=23 hours Quarter Mean=7889231, This Quarter=7768260, Diff=-34 hours
As you can see from the output:
Table of Contents
►Chinese Calendar Background Information
Astronomical Bases of Calendars
►Equinoxes, Solstices and Seasons
Position of Sun - Longitude Angle
Chinese Calendar Algorithm and Program
Chinese Calendars: Year 1901 to 1910
Chinese Calendars: Year 1911 to 1920
Chinese Calendars: Year 1921 to 1930
Chinese Calendars: Year 1931 to 1940
Chinese Calendars: Year 1941 to 1950
Chinese Calendars: Year 1951 to 1960
Chinese Calendars: Year 1961 to 1970
Chinese Calendars: Year 1971 to 1980
Chinese Calendars: Year 1981 to 1990
Chinese Calendars: Year 1991 to 2000
Chinese Calendars: Year 2001 to 2010
Chinese Calendars: Year 2011 to 2020
Chinese Calendars: Year 2021 to 2030
Chinese Calendars: Year 2031 to 2040
Chinese Calendars: Year 2041 to 2050
Chinese Calendars: Year 2051 to 2060
Chinese Calendars: Year 2061 to 2070
Chinese Calendars: Year 2071 to 2080
Chinese Calendars: Year 2081 to 2090