home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / turbopas / tpzsfz.arc / TPZUNIX.PAS < prev    next >
Pascal/Delphi Source File  |  1988-09-18  |  3KB  |  105 lines

  1. UNIT TPZunix;
  2. INTERFACE
  3. USES Dos;
  4. {file date and time functions}
  5.  
  6. FUNCTION Z_ToUnixDate(fdate: LONGINT): STRING;
  7. FUNCTION Z_FromUnixDate(s: STRING): LONGINT;
  8.  
  9. IMPLEMENTATION
  10.  
  11. CONST
  12.    C1970 = 2440588;
  13.    D0 =    1461;
  14.    D1 =  146097;
  15.    D2 = 1721119;
  16.  
  17. Procedure GregorianToJulianDN(Year, Month, Day : Integer;
  18.                                   var JulianDN : LongInt);
  19. var
  20.   Century,
  21.   XYear    : LongInt;
  22. begin {GregorianToJulianDN}
  23.   If Month <= 2 then begin
  24.     Year := pred(Year);
  25.     Month := Month + 12;
  26.     end;
  27.   Month := Month - 3;
  28.   Century := Year div 100;
  29.   XYear := Year mod 100;
  30.   Century := (Century * D1) shr 2;
  31.   XYear := (XYear * D0) shr 2;
  32.   JulianDN := ((((Month * 153) + 2) div 5) + Day) + D2
  33.                                     + XYear + Century;
  34. end; {GregorianToJulianDN}
  35.  
  36. Procedure JulianDNToGregorian(JulianDN : LongInt;
  37.                   var Year, Month, Day : Integer);
  38. var
  39.   Temp,
  40.   XYear   : LongInt;
  41.   YYear,
  42.   YMonth,
  43.   YDay    : Integer;
  44. begin {JulianDNToGregorian}
  45.   Temp := (((JulianDN - D2) shl 2) - 1);
  46.   XYear := (Temp mod D1) or 3;
  47.   JulianDN := Temp div D1;
  48.   YYear := (XYear div D0);
  49.   Temp := ((((XYear mod D0) + 4) shr 2) * 5) - 3;
  50.   YMonth := Temp div 153;
  51.   If YMonth >= 10 then begin
  52.     YYear := YYear + 1;
  53.     YMonth := YMonth - 12;
  54.     end;
  55.   YMonth := YMonth + 3;
  56.   YDay := Temp mod 153;
  57.   YDay := (YDay + 5) div 5;
  58.   Year := YYear + (JulianDN * 100);
  59.   Month := YMonth;
  60.   Day := YDay;
  61. end; {JulianDNToGregorian}
  62.  
  63. FUNCTION Z_ToUnixDate(fdate: LONGINT): STRING;
  64. VAR
  65.    dt: DateTime;
  66.    secspast, datenum, dayspast: LONGINT;
  67.    s: STRING;
  68. BEGIN
  69.    UnpackTime(fdate,dt);
  70.    GregorianToJulianDN(dt.year,dt.month,dt.day,datenum);
  71.    dayspast := datenum - c1970;
  72.    secspast := dayspast * 86400;
  73.    secspast := secspast + dt.hour * 3600 + dt.min * 60 + dt.sec;
  74.    s := '';
  75.    WHILE (secspast <> 0) AND (Length(s) < 255) DO
  76.    BEGIN
  77.       s := Chr((secspast AND 7) + $30) + s;
  78.       secspast := (secspast SHR 3)
  79.    END;
  80.    s := '0' + s;
  81.    Z_ToUnixDate := s
  82. END;
  83.  
  84. FUNCTION Z_FromUnixDate(s: STRING): LONGINT;
  85. VAR
  86.    dt: DateTime;
  87.    secspast, datenum: LONGINT;
  88.    n: WORD;
  89. BEGIN
  90.    secspast := LONGINT(0);
  91.    FOR n := 1 TO Length(s) DO
  92.       secspast := (secspast SHL 3) + Ord(s[n]) - $30;
  93.    datenum := (secspast DIV 86400) + c1970;
  94.    JulianDNToGregorian(datenum,INTEGER(dt.year),INTEGER(dt.month),INTEGER(dt.day));
  95.    secspast := secspast MOD 86400;
  96.    dt.hour := secspast DIV 3600;
  97.    secspast := secspast MOD 3600;
  98.    dt.min := secspast DIV 60;
  99.    dt.sec := secspast MOD 60;
  100.    PackTime(dt,secspast);
  101.    Z_FromUnixDate := secspast
  102. END;
  103.  
  104. END.
  105.