This page will calculate the Equinox and Solstice dates are for a given year.
Type in a year or use the
buttons to step forward and backward year-by-year:
Equinox and Solstice Calculator
Special thanks to ...
Ken Slater for The Springfield Telescope Makers, Inc.
For supplying the underlying code for this project. See ...
stellafane.org/misc/equinox.html
The original interface has been modified for ease of access.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Stellafane Equinox & Solstice Calculator</title>
<meta charset="utf-8">
<meta name="description" content="Stellafane Equinox & Solstice Calculator">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1;">
<link rel="stylesheet" type="text/css" href="https://copy.exchange/EquinoxAndSolstice/stylesheet.css?v=2.0">
<style type="text/css">
div.ED input { font: 12px Verdana ; color: #C60000 ; text-align: center ; width: 800px ; font-weight: bold ; height: 25px ; border: 0 ; background-color: transparent ; }
</style>
<script language="JavaScript" type="text/javascript">
var year = "2020" ;
var Year = 0 ;
var inYr = "0" ;
var inYear = "0" ;
var numYr = 0 ;
var firstTime = true; // Initialization flag
var retVal = " " ;
function ToggleDisplay( d ) {
var obj = document.getElementById( d ) ;
obj.style.display = ( obj.style.display == 'none' ) ? 'block' : 'none' ;
}
function Hide( d ) {
if ( d != null ) { document.getElementById( d ).style.display = "none" ; }
}
function Reveal( d ) {
if ( d != null ) { document.getElementById( d ).style.display = "block" ; }
}
function isVisible( d ) {
if ( document.getElementById( d ).style.display == 'block' ) { return true ; } else { return false ; } ;
}
function isLeap( y ) {
if ( y != null ) {
if ( y % 4 == 0 ) {
if ( y % 100 == 0 ) { if ( y % 400 == 0 ) { return true ; } else { return false ; } }
return true ; } }
return false ;
}
var MoEnd = Array( 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ) ;
function divideYr ( y ) {
var SpD = 24 * 60 * 60 ;
var yLen = 365 ;
if ( isLeap( y ) ) { yLen = 366 ; MoEnd[ 2 ] = 29 ; }
var SpY = SpD * 365.2425 ;
var SpQ1 = SpY / 4 ;
var SpQ2 = SpY / 2 ;
var SpQ3 = SpY * 0.75 ;
StY = SpD * yLen ;
var StQ1 = StY / 4 ;
var StQ2 = StY / 2 ;
var StQ3 = StY * 0.75 ;
var qDays = Math.floor( yLen / 4 ) ;
var rDays = ( yLen - ( qDays * 4 ) ) / 4 ;
var qHrs = Math.floor( rDays * 24 ) ;
var rHrs = ( ( rDays * 24 ) - qHrs ) ;
var qMin = Math.floor( rHrs * 60 ) ;
var rMin = ( ( rHrs * 60 ) - qMin ) ;
retVal = "for year " + y.toString() + " there are " + qDays.toString() + "days/qtr plus " + qHrs.toString() + " hours plus " + qMin.toString() ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
}
//-----Date Input Functions--------------------------------------------------------
function setYear() { document.forms[ "frm" ].year.value = yyyy ; return yyyy ; }
function getYear() { return Number( document.forms[ "frm" ].year.value ) ; }
function getTZ() { // this handles the time zone radio buttons
for( var n=0; n < document.frm.TZ.length; n++ )
if( document.frm.TZ[n].checked) { return document.frm.TZ[n].value; } else { return "None" ; }
}
function nextYear() { inYr = document.forms[ "frm" ].year.value ; numYr = Math.floor( inYr ) ; numYr ++ ; inYr = numYr.toString() ; document.forms[ "frm" ].year.value = inYr ; resetVal() ; }
function prevYear() { inYr = document.forms[ "frm" ].year.value ; numYr = Math.floor( inYr ) ; numYr = numYr - 1 ; inYr = numYr.toString() ; document.forms[ "frm" ].year.value = inYr ; resetVal() ; }
function thisYear() { inYr = yyyy ; document.forms[ "frm" ].year.value = inYr ; resetVal() ; }
function setCurrentYear() { document.forms[ "frm" ].year.value = yyyy ; }
function valiDate(){
// Validates that the input year is a valid integer between -4712 to +3500
// Returns true if valid, false if not
var i,j;
if (document.frm.year.value === "") {
retVal = "Please enter a value for the \"Year\" field." ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
document.frm.year.focus(); return false;
}
var checkOK = "0123456789-+"; // valid character list
var checkStr = document.frm.year.value;
var allValid = true;
for ( i = 0; i < checkStr.length; i++) {
for (j = 0; j < checkOK.length; j++)
{ if (checkStr.charAt(i) == checkOK.charAt(j)) { break; } }
if (j == checkOK.length) { allValid = false; break; }
}
if ( !allValid ) {
retVal = "Please enter only digit characters and \"+\" or \"-\" in the \"Year\" field." ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
document.frm.year.focus(); return false;
}
if ( ( getYear() < 1752 ) || ( getYear() > 3000 ) ) {
retVal = " ( " + getYear().toString + " ) Please enter a value greater than or equal to \"1752\" and less than or equal to \"3000\" in the \"Year\" field." ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
document.frm.year.focus(); return false;
}
return true;
}
//-----Output Functions------------------------------------------------------------
function clearAll() { for( var i=1; i<=4; i++ ) { writeN( i, "" ); } }
function writeN( n, str ) { document.getElementById('out'+n).innerHTML = str; }
//-----Utility Funtions------------------------------------------------------------
function INT ( n ) { return Math.floor(n); } // Emulates BASIC's INT Funtion
function POW2( n ) { return Math.pow(n,2); } // Square a number
function POW3( n ) { return Math.pow(n,3); } // Cube a number
function POW4( n ) { return Math.pow(n,4); } // Number to the 4th power
function COS( deg ) { // Cosine function with degrees as input
return Math.cos( deg * Math.PI/180 );
}
function noSubmit() { return false; } //Prevent form submission
function resetVal() {
if ( firstTime ) { setYear(); firstTime = false; }
clearAll();
inYr = document.forms[ "frm" ].year.value ;
retVal = "Values shown for year " + inYr ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
document.forms[ "frm" ].year.value = inYr ;
document.forms[ "gmtForm" ].fetchYear.value = inYr ;
if ( !Number( inYr ) ) {
retVal = "Input year \'" + inYr + "\' is not numeric." ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ; return ; }
else {
Year = getYear() ;
if ( ( Year <= 1752 ) || ( Year > 3000 ) ) {
retVal = "Input year \'" + inYr + "\' not attempted. Year must be greater than 1752 and less than 3000." ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ; return ; }
}
year = getYear() ;
// divideYr( year ) ;
//Main Calculations started here
for( var i=1; i<=4; i++ ) { // Loop over 4 events: 1=AE, 2=SS, 3-VE, 4=WS
calcEquiSol( i, year ); // This routine calculates and displays a single event
}}
function calc() {
inYr = document.forms[ "frm" ].year.value ;
if( inYr == ' ' ) {
inYr = yyyy ;
retVal = "Values for current year shown here" ;
}
else {
Year = Math.floor( inYr ) ;
retVal = "Year selected year is " + inYr ;
if ( Year <= 1752 ) {
retVal = "Input year \"" + Year.toString() + "\" not attempted. Year must be > 1752." ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
return ; }
//-----Main Function---------------------------------------------------------------
else { resetVal() ; } }
} // End calc
function initVal() {
document.forms[ "frm" ].year.value = yyyy ;
calc() ;
}
//-----Calculate and Display a single event for a single year (Either a Equiniox or Solstice)
// Meeus Astronmical Algorithms Chapter 27
function calcEquiSol( i, year ) {
var k = i - 1;
var str;
var JDE0 = calcInitial( k, year); // Initial estimate of date of event
var T = ( JDE0 - 2451545.0) / 36525;
var W = 35999.373*T - 2.47;
var dL = 1 + 0.0334*COS(W) + 0.0007*COS(2*W);
var S = periodic24( T );
var JDE = JDE0 + ( (0.00001*S) / dL ); // This is the answer in Julian Emphemeris Days
var TDT = fromJDtoUTC( JDE ); // Convert Julian Days to TDT in a Date Object
var UTC = fromTDTtoUTC( TDT ); // Correct TDT to UTC, both as Date Objects
switch ( getTZ() ) {
case "LCL": str = UTC.toString() + "\n"; //Convert to Local time string
str = str.replace( / \(/g, "<br>(" ); break;
case "UTC": str = UTC.toUTCString() + "\n"; break; //Convert to UTC time string
case "DYN": str = TDT.toUTCString() + "\n"; //Convert to Dynamical Time String
str = str.replace( /GMT/g, "TDT" ); break; // Change UTC to TDT in this output string
}
writeN( i, str ); // Output date & time of event in Local Time
} // End calcEquiSol
//-----Calcualte an initial guess as the JD of the Equinox or Solstice of a Given Year
// Meeus Astronmical Algorithms Chapter 27
function calcInitial( k, year ) { // Valid for years 1000 to 3000
var JDE0=0, Y=(year-2000)/1000;
switch( k ) {
case 0: JDE0 = 2451623.80984 + 365242.37404*Y + 0.05169*POW2(Y) - 0.00411*POW3(Y) - 0.00057*POW4(Y); break;
case 1: JDE0 = 2451716.56767 + 365241.62603*Y + 0.00325*POW2(Y) + 0.00888*POW3(Y) - 0.00030*POW4(Y); break;
case 2: JDE0 = 2451810.21715 + 365242.01767*Y - 0.11575*POW2(Y) + 0.00337*POW3(Y) + 0.00078*POW4(Y); break;
case 3: JDE0 = 2451900.05952 + 365242.74049*Y - 0.06223*POW2(Y) - 0.00823*POW3(Y) + 0.00032*POW4(Y); break;
}
return JDE0;
} // End calcInitial
//-----Calculate 24 Periodic Terms----------------------------------------------------
// Meeus Astronmical Algorithms Chapter 27
function periodic24( T ) {
var A = new Array(485,203,199,182,156,136,77,74,70,58,52,50,45,44,29,18,17,16,14,12,12,12,9,8);
var B = new Array(324.96,337.23,342.08,27.85,73.14,171.52,222.54,296.72,243.58,119.81,297.17,21.02,
247.54,325.15,60.93,155.12,288.79,198.04,199.76,95.39,287.11,320.81,227.73,15.45);
var C = new Array(1934.136,32964.467,20.186,445267.112,45036.886,22518.443,
65928.934,3034.906,9037.513,33718.147,150.678,2281.226,
29929.562,31555.956,4443.417,67555.328,4562.452,62894.029,
31436.921,14577.848,31931.756,34777.259,1222.114,16859.074);
var S = 0;
for( var i=0; i<24; i++ ) { S += A[i]*COS( B[i] + (C[i]*T) ); }
return S;
}
//-----Correct TDT to UTC----------------------------------------------------------------
//See https://eclipse.gsfc.nasa.gov/SEhelp/deltatpoly2004.html for possibly better corrections
function fromTDTtoUTC( tobj ) {
// from Meeus Astronmical Algroithms Chapter 10
// Correction lookup table has entry for every even year between TBLfirst and TBLlast
var TBLfirst = 1620, TBLlast = 2002; // Range of years in lookup table
var TBL = new Array( // Corrections in Seconds
/*1620*/ 121,112,103, 95, 88, 82, 77, 72, 68, 63, 60, 56, 53, 51, 48, 46, 44, 42, 40, 38,
/*1660*/ 35, 33, 31, 29, 26, 24, 22, 20, 18, 16, 14, 12, 11, 10, 9, 8, 7, 7, 7, 7,
/*1700*/ 7, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
/*1740*/ 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16,
/*1780*/ 16, 16, 16, 16, 16, 16, 15, 15, 14, 13,
/*1800*/ 13.1, 12.5, 12.2, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 11.9, 11.6, 11.0, 10.2, 9.2, 8.2,
/*1830*/ 7.1, 6.2, 5.6, 5.4, 5.3, 5.4, 5.6, 5.9, 6.2, 6.5, 6.8, 7.1, 7.3, 7.5, 7.6,
/*1860*/ 7.7, 7.3, 6.2, 5.2, 2.7, 1.4, -1.2, -2.8, -3.8, -4.8, -5.5, -5.3, -5.6, -5.7, -5.9,
/*1890*/ -6.0, -6.3, -6.5, -6.2, -4.7, -2.8, -0.1, 2.6, 5.3, 7.7, 10.4, 13.3, 16.0, 18.2, 20.2,
/*1920*/ 21.1, 22.4, 23.5, 23.8, 24.3, 24.0, 23.9, 23.9, 23.7, 24.0, 24.3, 25.3, 26.2, 27.3, 28.2,
/*1950*/ 29.1, 30.0, 30.7, 31.4, 32.2, 33.1, 34.0, 35.0, 36.5, 38.3, 40.2, 42.2, 44.5, 46.5, 48.5,
/*1980*/ 50.5, 52.5, 53.8, 54.9, 55.8, 56.9, 58.3, 60.0, 61.6, 63.0, 63.8, 64.3); /*2002 last entry*/
// Values for Delta T for 2000 thru 2002 from NASA
var deltaT = 0; // deltaT = TDT - UTC (in Seconds)
var Year = tobj.getUTCFullYear();
var t = (Year - 2000) / 100; // Centuries from the epoch 2000.0
if ( Year >= TBLfirst && Year <= TBLlast ) { // Find correction in table
if (Year%2) { // Odd year - interpolate
deltaT = ( TBL[(Year-TBLfirst-1)/2] + TBL[(Year-TBLfirst+1)/2] ) / 2;
} else { // Even year - direct table lookup
deltaT = TBL[(Year-TBLfirst)/2];
}
} else if( Year < 948) {
deltaT = 2177 + 497*t + 44.1*POW2(t);
} else if( Year >=948) {
deltaT = 102 + 102*t + 25.3*POW2(t);
if (Year>=2000 && Year <=2100) { // Special correction to avoid discontinurity in 2000
deltaT += 0.37 * ( Year - 2100 );
}
} else {
retVal= "Error: TDT to UTC correction not computed" ;
inYr = document.forms[ "frm" ].year.value ;
document.forms[ "EquinoxAndSolsticeFB" ].displayFB.value = retVal ;
inYr = yyyy ;
document.forms[ "frm" ].year.value = inYr ;
}
return( new Date( tobj.getTime() - (deltaT*1000) ) ); // JavaScript native time is in milliseonds
} // End fromTDTtoUTC
//-----Julian Date to UTC Date Object----------------------------------------------------
// Meeus Astronmical Algorithms Chapter 7
function fromJDtoUTC( JD ){
// JD = Julian Date, possible with fractional days
// Output is a JavaScript UTC Date Object
var A, alpha;
var Z = INT( JD + 0.5 ); // Integer JD's
var F = (JD + 0.5) - Z; // Fractional JD's
if (Z < 2299161) { A = Z; }
else {
alpha = INT( (Z-1867216.25) / 36524.25 );
A = Z + 1 + alpha - INT( alpha / 4 );
}
var B = A + 1524;
var C = INT( (B-122.1) / 365.25 );
var D = INT( 365.25*C );
var E = INT( ( B-D )/30.6001 );
var DT = B - D - INT(30.6001*E) + F; // Day of Month with decimals for time
var Mon = E - (E<13.5?1:13); // Month Number
var Yr = C - (Mon>2.5?4716:4715); // Year
var Day = INT( DT ); // Day of Month without decimals for time
var H = 24*(DT - Day); // Hours and fractional hours
var Hr = INT( H ); // Integer Hours
var M = 60*(H - Hr); // Minutes and fractional minutes
var Min = INT( M ); // Integer Minutes
var Sec = INT( 60*(M-Min) ); // Integer Seconds (Milliseconds discarded)
//Create and set a JavaScript Date Object and return it
var theDate = new Date(0);
theDate.setUTCFullYear(Yr, Mon-1, Day);
theDate.setUTCHours(Hr, Min, Sec);
return( theDate );
} //End fromJDtoUTC
</script>
<style>
#thebox {
width: max-content;
min-width: 70%;
}
div.result {
font: verdana ;
font-size: 10px ;
text-align: center ;
}
.result span {
font: verdana ;
font-size: 10px ;
text-align: center ;
}
.result p {
font: verdana ;
font-size: 12px ;
text-align: center ;
font-weight: bold ;
}
div#fineprint p { font-size: 12px ; margin-left: 10% ; text-align: left ; }
</style>
</head>
<body>
<?php
$jw = '/home/esand/public_html' ;
$jw_root = $jw.'/theCopyExchange' ;
$root = $jw_root.'/EquinoxAndSolstice' ;
?>
<main>
<div align="center" style="margin-top: 10% ; " >
<p style="Font: 14px Verdana ; font-weight: bold ; text-align: center ; " >This page will calculate the Equinox and Solstice dates are for a given year.<br>Type in a year or use the
buttons to step forward and backward year-by-year:<br><br> <br></p>
<div id="thebox" >
<form name="frm" >
<input name="year" maxlength="4" size="2" type="text" value=" " >
<input class="form" value="Fetch Equinox and Solstice dates for year" onClick="resetVal() ; calc() ; " name="button" type="button">
<table><tr>
<td class="R"><input type="button" value="Prev" name="prev" onclick="prevYear() ; "></td>
<td class="C"><input type="button" value="Now" name="thisYearBtn" onclick="initVal() ; "></td>
<td class="L"><input type="button" value="Next" name="next" onclick="nextYear() ; "></td>
</tr>
<tr>
<td class="C" colspan="3">
<div style="display: none ; " >Calculated Time:
<input type="radio" name="TZ" value="UTC" onclick="resetVal();" checked="checked" >UT
<input type="radio" name="TZ" value="DYN" onclick="resetVal();">TDT
</div>
</td>
</tr>
</table>
<div class="result">
<p>March Equinox</p>
<p id="out1">???</p>
</div>
<div class="result">
<p>June Solstice</p>
<p id="out2">???</p>
</div>
<div class="result">
<p>September Equinox</p>
<P id="out3">???</P>
</div>
<div class="result">
<p>December Solstice</p>
<p id="out4">???</p>
</div>
</form>
<div align="center" class="ED">
<form id="EquinoxAndSolsticeFB" ><br>
<input type="text" name="displayFB">
</form>
</div>
<?php
include( $jw_root.'/GMTtoUSA/GMTtoUSAform.php' ) ;
?>
<p> <br><a href="javascript: if ( isVisible( 'EquinoxAndSolsticeCode' ) ) { Hide( 'EquinoxAndSolsticeCode' ) ; Reveal( 'openSpace' ) ; } else { Reveal( 'EquinoxAndSolsticeCode' ) ; Hide( 'openSpace' ) ; } " class="x" >View source code</a><br></p>
<p> <br><a href="javascript: if ( isVisible( 'EquinoxAndSolsticeCred' ) ) { Hide( 'EquinoxAndSolsticeCred' ) ; Reveal( 'openSpace' ) ; } else { Reveal( 'EquinoxAndSolsticeCred' ) ; Hide( 'openSpace' ) ; } " class="x" >View credits</a><br></p>
</div>
<div id="openSpace" align="center" style="display: block ; margin-top: 2% ; " >
<img src="https://copy.exchange/img/transparentVertical.png" alt="blank space" width="1" height="10px" > <br>
</div>
</div>
<script language="JavaScript" type="text/javascript">
var today = new Date() ;
var mm = today.getMonth() + 1 ;
var yyyy = today.getFullYear().toString() ;
var datetoday = " " ;
if ( mm < 10 ) { datetoday = yyyy + "0" + mm ; } else { datetoday = yyyy + mm ; }
var thisYear = yyyy ;
initVal() ;
document.frm.year.focus() ;
</script>
<div id="EquinoxAndSolsticeCred" style="display: none ; text-align: center; margin-left: 20% ; margin-right: 20% ; border: 1px solid #822222 ; margin-top: 5%; margin-bottom: 5%; " >
<center>
<h2>Equinox and Solstice Calculator</h2>
<br><br><br>
Special thanks to ...
<br><b>
Ken Slater for The Springfield Telescope Makers, Inc.
<br>
For supplying the underlying code for this project. See ...
</b><br><br>
<a href="https://stellafane.org/misc/equinox.html" class="x" target="_blank" >stellafane.org/misc/equinox.html</a>
<br><br>
The original interface has been modified for ease of access.
<br>
</center>
</div>
<div id="EquinoxAndSolsticeCode" style="display: none ; text-align: left ; margin-left: 20% ; " >
<?php
if ( ( $sc = fopen( $root.'/EquinoxAndSolstice.php', 'r' ) ) != false ) {
while ( ( $record = fgets( $sc ) ) != false ) {
$record = str_replace( '&', '&', $record ) ;
$record = str_replace( '<', '<', $record ) ;
$record = str_replace( '>', '>', $record ) ;
print( $record.'<br>' ) ; }
fclose( $sc ) ;}
else { print( 'File not found in '.$root.'<br>' ) ; }
?>
</div>
<div id="fineprint" style="display: none ; " align="left" >
<p><strong>TIME ACCURACY:</strong> <i>The calculated times are in </i>Terrestrial Dynamical Time (TDT <i>or
</i>TT)<i>, a replacement for </i>Ephemeris Times (ET). <i>Meeus claims the error is less than one minute for
the years 1951-2050 for these calculations (the errors increase as you move farther away from these dates).
</i></p>
<p><b>CIVIL TIME: </b>TDT<i> is a uniform time used for astronomical calculations. Civil time, such as UTC (popularly
known as GMT, but technically incorrect) or your local time, is corrected for the non-linear changes in the
rotation of the earth. This is done accurately only through observations. This web page corrects the the calculated
TDT to civil time using a table of observations from 1620 thru 2002. Time corrections outside this range are
estimated from predictive equations. See Meeus' book for additional details. </i></p>
<p><b>LOCAL TIME: </b><i>Local time zone conversion is done by the JavaScript built-in runtime functions from
the corrected UTC (including daylight or summer time rules), based on information it gets from <b>your</b> computer's
environment settings. If the local time is in the wrong time zone for you, you need to check and adjust these
settings on your computer, there is nothing in this web page or the code behind it to change this. On Windows
machines, right click on the clock in the task bar and select "Adjust Date/Time", and then click the "Time Zone"
tab.</i></p>
<p><strong>CREDITS:</strong> <i>The algorithms and correction tables for this computation come directly from
the book </i><b>Astronomical Algorithms Second Edition </b><i>by Jean Meeus, c1998, published by <b>
<a href="http://www.willbell.com">Willmann-Bell</a></b>, Inc., Richmond, VA, ISBN
0-943396-61-1. They were coded in JavaScript and built into this web page by the web page author, Ken
Slater.</i></p>
<p><strong>CAUTION: </strong><em>While the output has been spot checked for correctness against known tables,
the code has not been thoroughly tested and could contain errors. The underlying algorithms are not exact and
times could vary by several minutes. Consult the book credited above for detailed information. </em><i>Note
also that the day-of-week will not be correct when the date is in the Julian calendar (earlier than 1582-Oct-15).</i></p>
</div>
</div>
</main>
</body>
</html>
TIME ACCURACY: The calculated times are in Terrestrial Dynamical Time (TDT or TT), a replacement for Ephemeris Times (ET). Meeus claims the error is less than one minute for the years 1951-2050 for these calculations (the errors increase as you move farther away from these dates).
CIVIL TIME: TDT is a uniform time used for astronomical calculations. Civil time, such as UTC (popularly known as GMT, but technically incorrect) or your local time, is corrected for the non-linear changes in the rotation of the earth. This is done accurately only through observations. This web page corrects the the calculated TDT to civil time using a table of observations from 1620 thru 2002. Time corrections outside this range are estimated from predictive equations. See Meeus' book for additional details.
LOCAL TIME: Local time zone conversion is done by the JavaScript built-in runtime functions from the corrected UTC (including daylight or summer time rules), based on information it gets from your computer's environment settings. If the local time is in the wrong time zone for you, you need to check and adjust these settings on your computer, there is nothing in this web page or the code behind it to change this. On Windows machines, right click on the clock in the task bar and select "Adjust Date/Time", and then click the "Time Zone" tab.
CREDITS: The algorithms and correction tables for this computation come directly from the book Astronomical Algorithms Second Edition by Jean Meeus, c1998, published by Willmann-Bell, Inc., Richmond, VA, ISBN 0-943396-61-1. They were coded in JavaScript and built into this web page by the web page author, Ken Slater.
CAUTION: While the output has been spot checked for correctness against known tables, the code has not been thoroughly tested and could contain errors. The underlying algorithms are not exact and times could vary by several minutes. Consult the book credited above for detailed information. Note also that the day-of-week will not be correct when the date is in the Julian calendar (earlier than 1582-Oct-15).