[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]
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)
[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]