[Back to DATETIME SWAG index]  [Back to Main SWAG index]  [Original]

{
 I need an accurate method of converting back and
 Forth between Gregorian and Julian dates.  if anyone
}

Procedure GregoriantoJulianDN;

Var
  Century,
  XYear    : LongInt;

begin {GregoriantoJulianDN}
  if Month <= 2 then begin
    Year := pred(Year);
    Month := Month + 12;
    end;
  Month := Month - 3;
  Century := Year div 100;
  XYear := Year mod 100;
  Century := (Century * D1) shr 2;
  XYear := (XYear * D0) shr 2;
  JulianDN := ((((Month * 153) + 2) div 5) + Day) + D2 + XYear + Century;
end; {GregoriantoJulianDN}

{**************************************************************}

Procedure JulianDNtoGregorian;

Var
  Temp,
  XYear   : LongInt;
  YYear,
  YMonth,
  YDay    : Integer;

begin {JulianDNtoGregorian}
  Temp := (((JulianDN - D2) shl 2) - 1);
  XYear := (Temp mod D1) or 3;
  JulianDN := Temp div D1;
  YYear := (XYear div D0);
  Temp := ((((XYear mod D0) + 4) shr 2) * 5) - 3;
  YMonth := Temp div 153;
  if YMonth >= 10 then begin
    YYear := YYear + 1;
    YMonth := YMonth - 12;
    end;
  YMonth := YMonth + 3;
  YDay := Temp mod 153;
  YDay := (YDay + 5) div 5;
  Year := YYear + (JulianDN * 100);
  Month := YMonth;
  Day := YDay;
end; {JulianDNtoGregorian}


{**************************************************************}

Procedure GregoriantoJulianDate;

Var
  Jan1,
  today : LongInt;

begin {GregoriantoJulianDate}
  GregoriantoJulianDN(Year, 1, 1, Jan1);
  GregoriantoJulianDN(Year, Month, Day, today);
  JulianDate := (today - Jan1 + 1);
end; {GregoriantoJulianDate}

{**************************************************************}

Procedure JuliantoGregorianDate;

Var
  Jan1  : LongInt;

begin
  GregoriantoJulianDN(Year, 1, 1, Jan1);
  JulianDNtoGregorian((Jan1 + JulianDate - 1), Year, Month, Day);
end; {JuliantoGregorianDate}


[Back to DATETIME SWAG index]  [Back to Main SWAG index]  [Original]