uses Math, DateUtils, SysUtils; const dteps = TDateTime(0.5)/(24*60*60*1000); procedure incday(var d,mo,y: longint; val: longint); overload; begin { only month 12 -> 11 or 1 is supported } inc(d,val); if d>=32 then begin inc(mo); dec(d,31); if mo>=13 then begin inc(y); dec(mo,12); end; end else if d<=0 then begin dec(mo); inc(d,31); end; end; procedure inchour(var d,mo,y,h: longint; val: longint); overload; begin inc(h,val); if h>=24 then begin incday(d,mo,y,h div 24); h:=h mod 24 end else if h<0 then begin incday(d,mo,y,(h-23) div 24); h:=h mod 24; if h<>0 then h:=h+24 end; end; procedure incmin(var d,mo,y,h,m: longint; val: longint); begin inc(m,val); if m>=60 then begin inchour(d,mo,y,h,m div 60); m:=m mod 60 end else if m<0 then begin inchour(d,mo,y,h,(m-59) div 60); m:=m mod 60; if m<>0 then m:=m+60; end; end; procedure incsec(var d,mo,y,h,m,s: longint; val: longint); begin inc(s,val); if s>=60 then begin incmin(d,mo,y,h,m,s div 60); s:=s mod 60; end else if s<0 then begin incmin(d,mo,y,h,m,(s-59) div 60); s:=s mod 60; if s<>0 then s:=s+60; end; end; procedure incmsec(var d,mo,y,h,m,s,mm: longint; val: longint); begin inc(mm,val); if mm>=1000 then begin incsec(d,mo,y,h,m,s,mm div 1000); mm:=mm mod 1000; end else if mm<0 then begin incsec(d,mo,y,h,m,s,(mm-999) div 1000); mm:=mm mod 1000; if mm<>0 then mm:=mm+1000; end; end; Procedure DoIt(d,mo,y,h,m,s,mm : Word) ; Var T : TDateTime; T2 : TDateTime; T3 : TDateTime; error: boolean; d1, mo1, y1, h1, m1, s1, mm1: longint; procedure initdatetime; begin d1:=d; mo1:=mo; y1:=y; h1:=h; m1:=m; s1:=s; mm1:=mm; end; begin error:=false; T:=EncodeDateTime(y,mo,d,h,m,s,mm); { IncMilliSecond } initdatetime; incmsec(d1,mo1,y1,h1,s1,m1,mm1,1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMilliSecond(T); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 1 msec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incmsec(d1,mo1,y1,h1,s1,m1,mm1,2*MSecsPerDay); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMilliSecond(T,2*MSecsPerDay); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 1 msec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incmsec(d1,mo1,y1,h1,m1,s1,mm1,-1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMilliSecond(T,-1); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 1 msec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incmsec(d1,mo1,y1,h1,m1,s1,mm1,-2*MSecsPerDay); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMilliSecond(T,-2*MSecsPerDay); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 2 days -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; { IncSecond } initdatetime; incsec(d1,m1,y1,h1,m1,s1,1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncSecond(T); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 1 sec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incsec(d1,mo1,y1,h1,m1,s1,140); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncSecond(T,140); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 140 sec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incsec(d1,mo1,y1,h1,m1,s1,-1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncSecond(T,-1); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 1 sec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incsec(d1,mo1,y1,h1,m1,s1,-140); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncSecond(T,-140); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 140 sec -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; { IncMinute } initdatetime; incmin(d1,mo1,y1,h1,m1,1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMinute(T); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 1 min -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incmin(d1,mo1,y1,h1,m1,200); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMinute(T,200); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 200 min -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incmin(d1,mo1,y1,h1,m1,-1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMinute(T,-1); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 1 min -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; incmin(d1,mo1,y1,h1,m1,-2); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncMinute(T3,-1); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 2 min -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; { IncHour } initdatetime; inchour(d1,mo1,y1,h1,1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncHour(T); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 1 hour -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; inchour(d1,mo1,y1,h1,2); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncHour(T3); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' + 2 hours -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; inchour(d1,mo1,y1,h1,-1); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncHour(T,-1); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 1 hour -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; initdatetime; inchour(d1,mo1,y1,h1,-2); T2:=EncodeDateTime(y1,mo1,d1,h1,m1,s1,mm1); T3:=IncHour(T3,-1); if not samevalue(t2,t3,dteps) then begin WriteLn('error: ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T),' - 2 hours -> ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T3),' instead of ',FormatDateTime('yyyy/mm/dd - hh:nn:ss:zzz',T2)); error:=true; end; if error then halt(1); end; begin { warning: the helpers used by Doit only support month 12 roll-overs (to either month 1 or month 11) } Doit(28,12,1899,23,59,59,999); Doit(28,12,1899,23,59,59,0); Doit(28,12,1899,23,59,0,0); Doit(28,12,1899,23,0,0,0); Doit(29,12,1899,23,59,59,999); Doit(29,12,1899,23,59,59,0); Doit(29,12,1899,23,59,0,0); Doit(29,12,1899,23,0,0,0); Doit(29,12,1899,0,0,0,0); Doit(30,12,1899,0,0,0,0); Doit(30,12,1899,0,0,0,1); Doit(30,12,1899,0,0,1,0); Doit(30,12,1899,0,1,0,0); Doit(30,12,1899,1,0,0,0); Doit(31,12,1899,0,0,0,1); Doit(31,12,1899,0,0,1,0); Doit(31,12,1899,0,1,0,0); Doit(31,12,1899,1,0,0,0); end.