Contributor: INBAR RAZ                
I saw a thread going on here, about the subject.
I just happen to have programmed such a thing, for a certain program. It's not
perfect, in the essence that It will produce good results only from 1970 to
2099, because I didn't feel like starting to investigate which are leap years
and which are not. All the leap years between 1970 and 2099 ARE included,
though.
---------------------------------= cut here =---------------------------------
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }
  { This procedure returns a LongInt UNIX-like timestamp. TimeRec will be  }
  { overwritten by the resulted UNSIGNED DWORD.                            }
  Procedure SecondSince1970(Year, Month, Day, Hour, Minute:Word; Var TimeRec);
  Var       T_Lo,
            T_Hi       : Word;
  Begin
    Asm
      Call @Table
  @Table:
      Pop Si
      Add Si,6            { Point Si to data table }
      Jmp @Compute
      { This table contains the number of days in all months UNTIL this one }
      dw  0               { Within January }
      dw  31              { January }
      dw  59              { February }
      dw  90              { Mars }
      dw  120             { April }
      dw  151             { May }
      dw  181             { June }
      dw  212             { July }
      dw  243             { August }
      dw  273             { September }
      dw  304             { October }
      dw  334             { November }
      { This i a routine to multiply a DWORD by a WORD }
      { Input: DX:AX word to multilpy, CX multiplier }
  @Calc:
      Push Si
      Push Di
      Mov Di,Dx
      Mov Si,Ax
      Dec Cx              { We already have it multiplied by 1 }
  @Addit:
      Add Ax,Si
      Adc Dx,Di
      Loop @Addit
      Pop Di
      Pop Si
      Ret
  @Compute:
      Xor Di,Di           { Variable for leap year }
      { Seconds of round years }
      Mov Bx,Year
      Sub Bx,1970
      Mov Ax,365*24       { Hours per year }
      Mov Cx,60*60        { Seconds per hour }
      Xor Dx,Dx
      Call @Calc          { Multiply dword response by CX }
      Mov Cx,Bx
      Call @Calc
      Push Ax
      Push Dx
      { Seconds of leap years }
      Mov Ax,Year
      Sub Ax,1972         { First leap year after 1972 }
      Mov Bx,4
      Xor Dx,Dx
      Div Bx
      { DX now holds number of days to add becaues of leap years. }
      { If DX is 0, this is a leap year, and we need to take it into
conideration }
      Mov Di,Dx          { If DI is 0, this is a leap year }
      Inc Ax             { We must count 1972 as well }
      Xor Dx,Dx
      Mov Bx,60*60
      Mov Cx,24
      Mul Bx
      Call @Calc
      Mov Cx,Dx
      Mov Bx,Ax
      { Now add what we had before }
      Pop Dx
      Pop Ax
      Add Ax,Bx
      Adc Dx,Cx
      Push Ax
      Push Dx
      { DX:AX holds the number of seconds since 1970 till the beginning of year
}
      { Add days within this year }
      Mov Bx,Month
      Dec Bx
      Shl Bx,1
      Add Bx,Si
      Mov Bx,cs:[Bx]      { Lookup Table, sum of months EXCEPT this one }
      Add Bx,Day          { Add days within this one }
      Dec Bx              { Today hasn't ended yet }
      Mov Ax,60*60
      Mov Cx,24
      Xor Dx,Dx
      Mul Bx
      Call @Calc
      Mov Cx,Dx
      Mov Bx,Ax
      { Now add what we had before - days until beginning of the year }
      Pop Dx
      Pop Ax
      Add Ax,Bx
      Adc Dx,Cx
      { DX:AX now holds the number of secondss since 1970 till beginning of
day. }
      Push Ax
      Push Dx
      { DX:AX holds the number of seconds until the beginning of this day }
      Mov Bx,Hour
      Mov Ax,60*60   { Seconds per hour }
      Xor Dx,Dx
      Mul Bx
      Push Ax
      Push Dx
      Mov Bx,Minute
      Mov Ax,60      { Seconds per minute }
      Xor Dx,Dx
      Mul Bx
      Mov Cx,Dx
      Mov Bx,Ax
      Pop Dx
      Pop Ax
      Add Bx,Ax
      Adc Cx,Dx
      { And add the seconds until beginning of year }
      Pop Dx
      Pop Ax
      Add Ax,Bx
      Adc Dx,Cx
      { DX:AX now holds number of second since 1970 }
      Mov T_Hi,Dx
      Mov T_Lo,Ax
    End;
      Move(Mem[Seg(T_Lo):Ofs(T_Lo)],
           Mem[Seg(TimeRec):Ofs(TimeRec)],2);
      Move(Mem[Seg(T_Hi):Ofs(T_Hi)],
           Mem[Seg(TimeRec):Ofs(TimeRec)+2],2);
  End;
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }
---------------------------------= cut here =---------------------------------
Hope this helps.
Inbar Raz
--- FMail 0.94
 * Origin: Castration takes balls. (2:403/100.42)