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()