mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 23:49:39 +02:00
+ Fixed EncodeDate/Time so they use TryEncodeDate/Time
This commit is contained in:
parent
c0547e20c5
commit
d9537256ab
@ -30,38 +30,29 @@ const
|
|||||||
((0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334),
|
((0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334),
|
||||||
(0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335));
|
(0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335));
|
||||||
|
|
||||||
function DoEncodeDate(Year, Month, Day: Word): longint;
|
Function DoEncodeDate(Year, Month, Day: Word): longint;
|
||||||
var
|
|
||||||
c, ya: cardinal;
|
Var
|
||||||
begin
|
D : TDateTime;
|
||||||
if (Month > 0) and (Month < 13) and (Day > 0) and (Day < 32) then
|
|
||||||
begin
|
|
||||||
if month > 2 then
|
|
||||||
Dec(Month,3)
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
Inc(Month,9);
|
|
||||||
Dec(Year);
|
|
||||||
end;
|
|
||||||
c:= Year DIV 100;
|
|
||||||
ya:= Year - 100*c;
|
|
||||||
result := (146097*c) SHR 2 + (1461*ya) SHR 2 + (153*cardinal(Month)+2) DIV 5 + cardinal(Day) - 693900;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
result:=0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function DoEncodeTime(Hour, Minute, Second, MilliSecond: word): longint;
|
|
||||||
begin
|
begin
|
||||||
If ((hour>=0) and (Hour<24)) and
|
If TryEncodeDate(Year,Month,Day,D) then
|
||||||
((Minute>=0) and (Minute<60)) and
|
Result:=Trunc(D)
|
||||||
((Second>=0) and (Second<60)) and
|
|
||||||
((MilliSecond>=0) and (Millisecond<1000)) then
|
|
||||||
Result := (Hour * 3600000 + Minute * 60000 + Second * 1000 + MilliSecond)
|
|
||||||
else
|
else
|
||||||
Result:=0;
|
Result:=0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function DoEncodeTime(Hour, Minute, Second, MilliSecond: word): longint;
|
||||||
|
|
||||||
|
Var
|
||||||
|
T : TDateTime;
|
||||||
|
|
||||||
|
begin
|
||||||
|
If TryEncodeTime(Hour,Minute,Second,MilliSecond,T) then
|
||||||
|
Result:=trunc(T*MSecsPerDay)
|
||||||
|
else
|
||||||
|
Result:=0;
|
||||||
|
end;
|
||||||
|
|
||||||
{==============================================================================}
|
{==============================================================================}
|
||||||
{ Public functions }
|
{ Public functions }
|
||||||
@ -98,35 +89,59 @@ begin
|
|||||||
result := TimeStamp.Time + timestamp.date*msecsperday;
|
result := TimeStamp.Time + timestamp.date*msecsperday;
|
||||||
end ;
|
end ;
|
||||||
|
|
||||||
|
Function TryEncodeDate(Year,Month,Day : Word; Var Date : TDateTime) : Boolean;
|
||||||
|
|
||||||
function TryEncodeDate(Year, Month, Day: Word; var Date: TDateTime): Boolean;
|
var
|
||||||
|
c, ya: cardinal;
|
||||||
begin
|
begin
|
||||||
Date := DoEncodeDate(Year, Month, Day);
|
Result:=(Year>0) and (Year<10000) and
|
||||||
Result:=(Date<>0);
|
(Month in [1..12]) and
|
||||||
|
(Day>0) and (Day<=MonthDays[IsleapYear(Year),Month]);
|
||||||
|
If Result then
|
||||||
|
begin
|
||||||
|
if month > 2 then
|
||||||
|
Dec(Month,3)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Inc(Month,9);
|
||||||
|
Dec(Year);
|
||||||
|
end;
|
||||||
|
c:= Year DIV 100;
|
||||||
|
ya:= Year - 100*c;
|
||||||
|
Date := (146097*c) SHR 2 + (1461*ya) SHR 2 + (153*cardinal(Month)+2) DIV 5 + cardinal(Day) - 693900;
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TryEncodeTime(Hour, Min, Sec, MSec:word; Var Time : TDateTime) : boolean;
|
||||||
|
|
||||||
function TryEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean;
|
|
||||||
begin
|
begin
|
||||||
Time := DoEncodeTime(hour, Min, Sec, MSec) / MSecsPerDay;
|
Result:=(Hour<24) and (Min<60) and (Sec<60) and (MSec<1000);
|
||||||
Result:=(Time<>0);
|
If Result then
|
||||||
|
Time:=(Hour*3600000+Min*60000+Sec*1000+MSec)/MSecsPerDay;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ EncodeDate packs three variables Year, Month and Day into a
|
{ EncodeDate packs three variables Year, Month and Day into a
|
||||||
TDateTime value the result is the number of days since 12/30/1899 }
|
TDateTime value the result is the number of days since 12/30/1899 }
|
||||||
|
|
||||||
function EncodeDate(Year, Month, Day: word): TDateTime;
|
function EncodeDate(Year, Month, Day: word): TDateTime;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
result := DoEncodeDate(Year, Month, Day);
|
If Not TryEncodeDate(Year,Month,Day,Result) then
|
||||||
end ;
|
Raise Exception.CreateFmt('%d-%d-%d is not a valid date specification',
|
||||||
|
[Year,Month,Day]);
|
||||||
|
end;
|
||||||
|
|
||||||
{ EncodeTime packs four variables Hour, Minute, Second and MilliSecond into
|
{ EncodeTime packs four variables Hour, Minute, Second and MilliSecond into
|
||||||
a TDateTime value }
|
a TDateTime value }
|
||||||
|
|
||||||
function EncodeTime(Hour, Minute, Second, MilliSecond:word):TDateTime;
|
function EncodeTime(Hour, Minute, Second, MilliSecond:word):TDateTime;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Result := DoEncodeTime(hour, minute, second, millisecond) / MSecsPerDay;
|
If not TryEncodeTime(Hour,Minute,Second,MilliSecond,Result) then
|
||||||
end ;
|
Raise Exception.CreateFmt('%d:%d:%d.%d is not a valid time specification',
|
||||||
|
[Hour,Minute,Second,MilliSecond]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ DecodeDate unpacks the value Date into three values:
|
{ DecodeDate unpacks the value Date into three values:
|
||||||
Year, Month and Day }
|
Year, Month and Day }
|
||||||
@ -700,7 +715,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.8 2002-12-25 01:03:48 peter
|
Revision 1.9 2003-01-18 23:45:37 michael
|
||||||
|
+ Fixed EncodeDate/Time so they use TryEncodeDate/Time
|
||||||
|
|
||||||
|
Revision 1.8 2002/12/25 01:03:48 peter
|
||||||
* some date constants added
|
* some date constants added
|
||||||
|
|
||||||
Revision 1.7 2002/09/07 21:06:51 carl
|
Revision 1.7 2002/09/07 21:06:51 carl
|
||||||
|
@ -28,9 +28,12 @@ type
|
|||||||
|
|
||||||
const
|
const
|
||||||
HoursPerDay = 24;
|
HoursPerDay = 24;
|
||||||
MinsPerDay = HoursPerDay * 60;
|
MinsPerHour = 60;
|
||||||
SecsPerDay = MinsPerDay * 60;
|
SecsPerMin = 60;
|
||||||
MSecsPerDay = SecsPerDay * 1000;
|
MSecsPerSec = 1000;
|
||||||
|
MinsPerDay = HoursPerDay * MinsPerHour;
|
||||||
|
SecsPerDay = MinsPerDay * SecsPerMin;
|
||||||
|
MSecsPerDay = SecsPerDay * MSecsPerSec;
|
||||||
|
|
||||||
DateDelta = 693594; // Days between 1/1/0001 and 12/31/1899
|
DateDelta = 693594; // Days between 1/1/0001 and 12/31/1899
|
||||||
UnixDateDelta = 25569;
|
UnixDateDelta = 25569;
|
||||||
@ -125,7 +128,10 @@ Procedure GetLocalTime(var SystemTime: TSystemTime);
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.7 2002-12-25 01:03:48 peter
|
Revision 1.8 2003-01-18 23:45:37 michael
|
||||||
|
+ Fixed EncodeDate/Time so they use TryEncodeDate/Time
|
||||||
|
|
||||||
|
Revision 1.7 2002/12/25 01:03:48 peter
|
||||||
* some date constants added
|
* some date constants added
|
||||||
|
|
||||||
Revision 1.6 2002/10/02 21:04:06 peter
|
Revision 1.6 2002/10/02 21:04:06 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user