Contributor: SWAG SUPPORT TEAM        

Unit Julian;
{DEMO Routines
/begin
/  ClrScr;
/  GetDate(Year,Month,Day,Dow);
/  WriteLn('Year  : ',Year);
/  WriteLn('Month : ',Month);
/  WriteLn('Day   : ',Day);
/  WriteLn('doW   : ',Dow);
/  WriteLn(MachineDate);
/  JulianDate := DatetoJulian(MachineDate);
/  WriteLn('Julian Date = ',JulianDate);
/  WriteLn('Jul to Date = ',JuliantoDate(JulianDate));
/  WriteLn('Day of Week = ',DayofWeek(JulianDate));
/  WriteLn('Time        = ',MachineTime(4));
/end.}
Interface

Uses Crt, Dos;

Type
  Str3  = String[3];
  Str8  = String[8];
  Str9  = String[9];
  Str11 = String[11];

Var
  Hour,Minute,Second,S100,
  Year,Month,Day,Dow     : Word;
  Syear,Smonth,Sday,Sdow : String;
  JulianDate             : Integer;

Function MachineTime(Len : Byte) : Str11;
Function MachineDate : Str8;
Function DateFactor(MonthNum, DayNum, YearNum : Real) : Real;
Function DatetoJulian(DateLine : Str8) : Integer;
Function JuliantoDate(DateInt : Integer): Str11;
Function JuliantoStr8(DateInt : Integer): Str8;
Function DayofWeek(Jdate : Integer) : Str3;
Procedure DateDiff(Date1,Date2 : Integer; Var Date_Difference : Str9);

Implementation
Function MachineTime(Len : Byte) : Str11;
Var
  I       : Byte;
  TempStr : String;
  TimeStr : Array[1..4] of String;
begin
  TempStr := ''; FillChar(TimeStr,Sizeof(TimeStr),0);
  GetTime(Hour,Minute,Second,S100);
  Str(Hour,TimeStr[1]);
  Str(Minute,TimeStr[2]);
  Str(Second,TimeStr[3]);
  Str(S100,TimeStr[4]);
  TempStr := TimeStr[1];
  For I := 2 to Len Do TempStr := TempStr + ':' + TimeStr[I];
  MachineTime := TempStr;
end;

Function MachineDate : Str8;
begin
  GetDate(Year,Month,Day,Dow);
  Str(Year,Syear);
  Str(Month,Smonth);
  if Month < 10 then Smonth := '0' + Smonth;
  Str(Day,Sday);
  if Day < 10 then Sday := '0' + Sday;
  MachineDate := smonth + sday + syear;
end;

Function DateFactor(MonthNum, DayNum, YearNum : Real) : Real;
Var
 Factor : Real;
begin
 Factor :=   (365 * YearNum)
           + DayNum
           + (31 * (MonthNum-1));
 if MonthNum < 3
  then Factor :=  Factor
                + Int((YearNum-1) / 4)
                - Int(0.75 * (Int((YearNum-1) / 100) + 1))
  else Factor :=  Factor
                - Int(0.4 * MonthNum + 2.3)
                + Int(YearNum / 4)
                - Int(0.75 * (Int(YearNum / 100) + 1));
 DateFactor := Factor;
end;

Function DatetoJulian(DateLine : Str8) : Integer;
Var
 Factor, MonthNum, DayNum, YearNum : Real;
 Ti : Integer;
begin
 if Length(DateLine) = 7
  then DateLine := '0'+DateLine;
 MonthNum := 0.0;
 For Ti := 1 to 2 Do
  MonthNum := (10 * MonthNum)
    + (ord(DateLine[Ti])-ord('0'));
 DayNum := 0.0;
 For Ti := 3 to 4 Do
  DayNum := (10 * DayNum)
    + (ord(DateLine[Ti])-ord('0'));
 YearNum := 0.0;
 For Ti := 5 to 8 Do
  YearNum := (10 * YearNum)
    + (ord(DateLine[Ti])-ord('0'));
 Factor := DateFactor(MonthNum, DayNum, YearNum);
 DatetoJulian :=
  Trunc((Factor - 679351.0) - 32767.0);
end;

Function JuliantoDate(DateInt : Integer): Str11;
Var
 holdstr  : String[2];
 anystr  : String[11];
 StrMonth : String[3];
 strDay   : String[2];
 stryear  : String[4];
 test,
 error,
 Year,
 Dummy,
 I       : Integer;
 Save,Temp    : Real;
 JuliantoanyString : Str11;
begin
 holdstr := '';
 JuliantoanyString := '00000000000';
 Temp  := Int(DateInt) + 32767 + 679351.0;
 Save  := Temp;
 Dummy := Trunc(Temp/365.5);
 While Save >= DateFactor(1.0,1.0,Dummy+0.0)
  Do Dummy := Succ(Dummy);
 Dummy := Pred(Dummy);
 Year  := Dummy;
 (* Determine number of Days into current year *)
 Temp  := 1.0 + Save - DateFactor(1.0,1.0,Year+0.0);
 (* Put the Year into the output String *)
 For I := 8 downto 5 Do
  begin
   JuliantoanyString[I]
    := Char((Dummy mod 10)+ord('0'));
   Dummy := Dummy div 10;
  end;
 Dummy := 1 + Trunc(Temp/31.5);
 While Save >= DateFactor(Dummy+0.0,1.0,Year+0.0)
  Do Dummy := Succ(Dummy);
 Dummy := Pred(Dummy);
 Temp  := 1.0 + Save - DateFactor(Dummy+0.0,1.0,Year+0.0);
 For I := 2 Downto 1 Do
  begin
   JuliantoanyString[I]
    := Char((Dummy mod 10)+ord('0'));
   Dummy := Dummy div 10;
  end;
 Dummy := Trunc(Temp);
 For I := 4 Downto 3 Do
  begin
   JuliantoanyString[I]
    := Char((Dummy mod 10)+ord('0'));
   Dummy := Dummy div 10;
  end;
  holdstr := copy(juliantoanyString,1,2);
  val(holdstr,test,error);
  Case test of
    1 : StrMonth := 'Jan';
    2 : StrMonth := 'Feb';
    3 : StrMonth := 'Mar';
    4 : StrMonth := 'Apr';
    5 : StrMonth := 'May';
    6 : StrMonth := 'Jun';
    7 : StrMonth := 'Jul';
    8 : StrMonth := 'Aug';
    9 : StrMonth := 'Sep';
   10 : StrMonth := 'Oct';
   11 : StrMonth := 'Nov';
   12 : StrMonth := 'Dec';
  end;
  stryear := copy(juliantoanyString,5,4);
  strDay  := copy(juliantoanyString,3,2);
  anystr := StrDay + '-' + StrMonth + '-' +stryear;
 JuliantoDate := anystr;
end;

Function JuliantoStr8(DateInt : Integer): Str8;
Var
 holdstr  : String[2]; anystr   : String[8]; StrMonth : String[2];
 strDay   : String[2]; stryear  : String[4]; Save, Temp : Real;
 test, error, Year, Dummy, I : Integer; JuliantoanyString : Str8;
begin
 holdstr := ''; JuliantoanyString := '00000000';
 Temp  := Int(DateInt) + 32767 + 679351.0;
 Save  := Temp; Dummy := Trunc(Temp/365.5);
 While Save >= DateFactor(1.0,1.0,Dummy+0.0) Do Dummy := Succ(Dummy);
 Dummy := Pred(Dummy); Year  := Dummy;
 Temp  := 1.0 + Save - DateFactor(1.0,1.0,Year+0.0);
 For I := 8 downto 5 Do
  begin
   JuliantoanyString[I] := Char((Dummy mod 10)+ord('0'));
   Dummy := Dummy div 10;
  end;
 Dummy := 1 + Trunc(Temp/31.5);
 While Save >= DateFactor(Dummy+0.0,1.0,Year+0.0) Do Dummy := Succ(Dummy);
 Dummy := Pred(Dummy);
 Temp  := 1.0 + Save - DateFactor(Dummy+0.0,1.0,Year+0.0);
 For I := 2 Downto 1 Do
  begin
   JuliantoanyString[I] := Char((Dummy mod 10)+ord('0'));
   Dummy := Dummy div 10;
  end;
 Dummy := Trunc(Temp);
 For I := 4 Downto 3 Do
  begin
   JuliantoanyString[I] := Char((Dummy mod 10)+ord('0'));
   Dummy := Dummy div 10;
  end;
  holdstr := copy(juliantoanyString,1,2); val(holdstr,test,error);
  Case test of
  1 : StrMonth := '01'; 2 : StrMonth := '02'; 3 : StrMonth := '03';
  4 : StrMonth := '04'; 5 : StrMonth := '05'; 6 : StrMonth := '06';
  7 : StrMonth := '07'; 8 : StrMonth := '08'; 9 : StrMonth := '09';
 10 : StrMonth := '10'; 11 : StrMonth := '11'; 12 : StrMonth := '12';
  end;
  StrYear := copy(juliantoanyString,5,4);
  StrDay  := copy(juliantoanyString,3,2);
  AnyStr := StrMonth + StrDay + StrYear; JuliantoStr8 := AnyStr;
end;

Function DayofWeek(Jdate : Integer) : Str3;
begin
  Case jdate MOD 7 of
   0:DayofWeek:='Sun'; 1:DayofWeek:='Mon'; 2:DayofWeek := 'Tue';
   3:DayofWeek:='Wed'; 4:DayofWeek:='Thu'; 5:DayofWeek := 'Fri';
   6:DayofWeek:='Sat';
  end;
end;

Procedure DateDiff(Date1,Date2 : Integer;
           Var Date_Difference : Str9);
Var
 Temp,Rdate1,Rdate2,Diff1 : Real;      Diff : Integer;
 Return                   : String[9]; Hold : String[3];
begin
  Rdate2 := Date2 + 32767.5; Rdate1 := Date1 + 32767.5;
  Diff1  := Rdate1 - Rdate2; Temp   := Diff1;
  if Diff1 < 32 then (* determine number of Days *)
  begin
    Diff := Round(Diff1); Str(Diff,Hold);
    Return := Hold + ' ' + 'Day';
    if Diff > 1 then Return := Return + 's  ';
  end;
  if ((Diff1 > 31) and (Diff1 < 366)) then
  begin
    Diff1 := Diff1 / 30; Diff := Round(Diff1); Str(Diff,Hold);
    Return := Hold + ' ' + 'Month';
    if Diff > 1 then Return := Return + 's';
  end;
  if Diff1 > 365 then
  begin
    Diff1 := Diff1 / 365; Diff := Round(Diff1); Str(Diff,Hold);
    Return := Hold;
  end;
  Date_Difference := Return; Diff := Round(Diff1);
end;
end.