ALX 2018-09-04
# with a deviation less than 15 minutes proc AstronomicalSeasons {year} { set Y [expr {($year - 2000) / 1000.0}] # Julian to Gregorian proc J2G { jda } { set jd [expr {floor($jda + 0.5)}] set z [expr {$jda - $jd + 0.500001}] set tz [expr {$jd - 1721117}] if {$jd > 2299160} { set tz [expr {$tz + (floor(($tz + 2) / 36524.25) - floor(($tz + 2) / 146097) - 2)}] } set y [expr {floor(($tz - 0.2) / 365.25)}] set r [expr {$tz - floor($y * 365.25)}] set m [expr {floor(($r - 0.5) / 30.6)}] set d [expr {$r - floor($m * 30.6 + 0.5)}] set m [expr {$m + 3}] if {$m > 12} { set m [expr {$m - 12}] set y [expr {$y + 1}] } set h1 [expr {$z * 24}] set ho [expr {floor($h1)}] set mi [expr {floor(($h1 - $ho) * 60)}] return [format {%04d-%02d-%02d %02d:%02d} [expr {int($y)}] [expr {int($m)}] [expr {int($d)}] [expr {int($ho)}] [expr {int($mi)}]] } # March-equinox (Beginning of the astronomical spring): set jda [expr {2451623.80984 + 365242.37404 * $Y + 0.05169 * pow($Y,2) - 0.00411 * pow($Y,3) - 0.00057 * pow($Y,4)}] puts "Spring [J2G $jda]" # June-solstice (Beginning of the astronomical summer): set jda [expr {2451716.56767 + 365241.62603 * $Y + 0.00325 * pow($Y,2) + 0.00888 * pow($Y,3) - 0.00030 * pow($Y,4)}] puts "Summer [J2G $jda]" # September-equinox (Beginning of the astronomical autumn) set jda [expr {2451810.21715 + 365242.01767 * $Y - 0.11575 * pow($Y,2) + 0.00337 * pow($Y,3) + 0.00078 * pow($Y,4)}] puts "Autumn [J2G $jda]" # December-solstice (Beginning of the astronomical winter): set jda [expr {2451900.05952 + 365242.74049 * $Y - 0.06223 * pow($Y,2) - 0.00823 * pow($Y,3) + 0.00032 * pow($Y,4)}] puts "Winter [J2G $jda]" } AstronomicalSeasons 2018
Result:
Spring 2018-03-20 16:08 Summer 2018-06-21 10:00 Autumn 2018-09-23 01:45 Winter 2018-12-21 22:17
BSD-3 license
See Also: https://tcl.sowaswie.de/repos/fossil/snippets/dir?name=calendar