mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-10 23:20:29 +02:00
306 lines
8.9 KiB
ObjectPascal
306 lines
8.9 KiB
ObjectPascal
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.
|