home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / PROTOCOL / TPHYD100.ZIP / H_DATE.PAS < prev    next >
Pascal/Delphi Source File  |  1993-08-18  |  4KB  |  121 lines

  1. {$A+,B-,D-,E-,F-,I-,L-,N-,O+,R-,S-,V-}
  2. (******************************************************************************)
  3. (*                      Hydra Bi-directional Protocol                         *)
  4. (*                        ─────────────────────────                           *)
  5. (*                                                                            *)
  6. (*                         Unix Date/Time Routines                            *)
  7. (*                                                                            *)
  8. (* BY: Adam Blake                                      Wandoo Valley Software *)
  9. (*     Arjen Lentz                                         and Lentz Software *)
  10. (* VER: 1.00                                                      Development *)
  11. (* DATE: 5th August 1993                                   (c) Copyright 1993 *)
  12. (* LANGUAGE: Turbo Pascal v6.0                  All Rights Reserved Worldwide *)
  13. (******************************************************************************)
  14. Unit h_Date;
  15. Interface
  16.  
  17. uses
  18.   DOS;
  19.  
  20.  
  21. Function h_ToUnixDate( FDate : longint ) : longint;
  22.  
  23. Function h_FromUnixDate( UnixDate : longint ) : longint;
  24.  
  25. (******************************************************************************)
  26. Implementation
  27.  
  28. const
  29.   C1970 = 2440588;
  30.   D0    =    1461;
  31.   D1    =  146097;
  32.   D2    = 1721119;
  33.  
  34.  
  35. Procedure GregorianToJulianDN( Year, Month, Day : integer;
  36.                                var JulianDN : longint );
  37. var
  38.   Century,
  39.   XYear    : longint;
  40. begin
  41.   If Month <= 2 then
  42.     begin
  43.       Year  := Pred(Year);
  44.       Month := Month + 12;
  45.     end;
  46.   Month    := Month - 3;
  47.   Century  := Year div 100;
  48.   XYear    := Year mod 100;
  49.   Century  := (Century * D1) shr 2;
  50.   XYear    := (XYear * D0) shr 2;
  51.   JulianDN := ((((Month * 153) + 2) div 5) + Day) + D2 + XYear + Century;
  52. end;
  53.  
  54.  
  55. Procedure JulianDNToGregorian( JulianDN : longint;
  56.                                var Year, Month, Day : integer );
  57. var
  58.   Temp,
  59.   XYear   : longint;
  60.   YYear,
  61.   YMonth,
  62.   YDay    : integer;
  63. begin
  64.   Temp     := (((JulianDN - D2) shl 2) - 1);
  65.   XYear    := (Temp mod D1) or 3;
  66.   JulianDN := Temp div D1;
  67.   YYear    := (XYear div D0);
  68.   Temp     := ((((XYear mod D0) + 4) shr 2) * 5) - 3;
  69.   YMonth   := Temp div 153;
  70.   If YMonth >= 10 then
  71.     begin
  72.       YYear  := YYear + 1;
  73.       YMonth := YMonth - 12;
  74.     end;
  75.   YMonth := YMonth + 3;
  76.   YDay   := Temp mod 153;
  77.   YDay   := (YDay + 5) div 5;
  78.   Year   := YYear + (JulianDN * 100);
  79.   Month  := YMonth;
  80.   Day    := YDay;
  81. end;
  82.  
  83.  
  84. Function h_ToUnixDate( FDate : longint ) : longint;
  85. var
  86.   DT       : DateTime;
  87.   DateNum,
  88.   SecsPast,
  89.   DaysPast : longint;
  90. begin
  91.   UnpackTime(FDate,DT);
  92.   GregorianToJulianDN(DT.Year,DT.Month,DT.Day,DateNum);
  93.   DaysPast := DateNum - c1970;
  94.   SecsPast := DaysPast * 86400;
  95.   SecsPast := SecsPast + DT.Hour * 3600 + DT.Min * 60 + DT.Sec;
  96.   h_ToUnixDate := SecsPast;
  97. end;
  98.  
  99.  
  100. Function h_FromUnixDate( UnixDate : longint ) : longint;
  101. var
  102.   DT       : DateTime;
  103.   DateNum  : longint;
  104.   n        : word;
  105. begin
  106.   DateNum := (UnixDate div 86400) + c1970;
  107.   JulianDNToGregorian(DateNum,integer(DT.Year),integer(DT.Month),integer(DT.Day));
  108.   UnixDate := UnixDate mod 86400;
  109.   DT.Hour  := UnixDate div 3600;
  110.   UnixDate := UnixDate mod 3600;
  111.   DT.Min   := UnixDate div 60;
  112.   DT.Sec   := UnixDate mod 60;
  113.   PackTime(DT,UnixDate);
  114.   h_FromUnixDate := UnixDate;
  115. end;
  116.  
  117. (**********************************MAINLINE************************************)
  118.  
  119. end.
  120.  
  121.