THE INVERSE SIGNED JULIAN DAY NUMBER FUNCTION
/*
###########################################################################
This function is the inverse of the JD_Number() function and returns the
numerical date elements (y, m, d) corresponding to any signed Julian
Day number in the range from -5583424 to 9026275 or in the range from
'BC 20000-Jan-01' to 'AD 20000-Dec-31' on either the Julian or the
Gregorian (Default) calendar system.
The numerical date elements are returned in a CSV string as 'y, m, d'.
(y, m, d) = (Year, Month, Day), where BC years = Negative values.
J|G Calendar Mode: 'J' = Julian or 'G' = Gregorian = Default
ERRORS:
Returns FALSE on error = Non-numeric JD number or out of range JD number.
###########################################################################
*/
function Inv_JD_Number ($JDNumber, $JorG='G')
{
$JDNum = trim($JDNumber);
// --------------------------------------------------
// Return FALSE if JD number argument is non-numeric.
if (!Is_Numeric($JDNum)) {return FALSE;}
// -----------------------------
// Get J|G mode ('G' = Default).
$JorG = substr(StrToUpper(trim($JorG)),0,1);
$JorG = ($JorG == 'J')? 'J':'G';
$CAdj = ($JorG == 'J')? 0:1;
/* ---------------------------------------------------------
RETURN FALSE IF JD NUMBER ARGUMENT IS OUT OF VALID RANGE
FOR THE SELECTED CALENDAR SYSTEM.
*/
// --------------------------
// Check for Julian calendar.
if ($JorG == 'J')
{
if ($JDNum < -5583576 or $JDNum > 9026423) {return FALSE;}
}
// -----------------------------
// Check for Gregorian calendar.
if ($JorG == 'G')
{
if ($JDNum < -5583424 or $JDNum > 9026275) {return FALSE;}
}
/* -----------------------------------------
Compute numerical date elements (y, m, d)
according to the calendar mode selection.
*/
$A = floor($JDNum + 0.5);
$B = $CAdj*floor(($A - 1867216.25) / 36524.25);
$C = $A + $CAdj*($B - floor($B/4) + 1);
$D = $C + 1524;
$E = floor(($D - 122.1) / 365.25);
$F = floor(365.25 * $E);
$G = floor(($D - $F) / 30.6001);
$d = $D - $F - floor(30.6001 * $G); // Day num (1 to 31)
$m = $G - 12*floor($G/14) - 1; // Month num (1 to 12)
$y = $E - 4716 + floor((14 - $m) / 12); // Mathematical year (y)
$Y = ($y > 0)? $y : $y-1; // Calendar year (Y) Negative = BC
return "$Y/$m/$d";
} // END OF Inv_JD_Number()
******************************************************************************
******************************************************************************
THE ABOVE PHP FUNCTION WITHOUT THE COMMENTS:
function Inv_JD_Num ($JDNumber, $JorG='G')
{
$JDNum = trim($JDNumber);
if (!Is_Numeric($JDNum)) {return FALSE;}
$JorG = substr(StrToUpper(trim($JorG)),0,1);
$JorG = ($JorG == 'J')? 'J':'G';
$CMode = ($JorG == 'J')? 0:1;
if ($JorG == 'J')
{
if ($JDNum < -5583576 or $JDNum > 9026423) {return FALSE;}
}
if ($JorG == 'G')
{
if ($JDNum < -5583424 or $JDNum > 9026275) {return FALSE;}
}
$A = floor($JDNum + 0.5);
$B = $CMode*floor(($A - 1867216.25) / 36524.25);
$C = $A + $CMode*($B - floor($B/4) + 1);
$D = $C + 1524;
$E = floor(($D - 122.1) / 365.25);
$F = floor(365.25 * $E);
$G = floor(($D - $F) / 30.6001);
$d = $D - $F - floor(30.6001 * $G);
$m = $G - 12*floor($G/14) - 1;
$y = $E - 4716 + floor((14 - $m) / 12);
$Y = ($y > 0)? $y : $y-1;
return "$Y/$m/$d";
} // END OF Inv_JD_Num()