mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-11 20:09:23 +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, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335));
|
||||
|
||||
function DoEncodeDate(Year, Month, Day: Word): longint;
|
||||
var
|
||||
c, ya: cardinal;
|
||||
Function DoEncodeDate(Year, Month, Day: Word): longint;
|
||||
|
||||
Var
|
||||
D : TDateTime;
|
||||
|
||||
begin
|
||||
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;
|
||||
If TryEncodeDate(Year,Month,Day,D) then
|
||||
Result:=Trunc(D)
|
||||
else
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function DoEncodeTime(Hour, Minute, Second, MilliSecond: word): longint;
|
||||
begin
|
||||
If ((hour>=0) and (Hour<24)) and
|
||||
((Minute>=0) and (Minute<60)) and
|
||||
((Second>=0) and (Second<60)) and
|
||||
((MilliSecond>=0) and (Millisecond<1000)) then
|
||||
Result := (Hour * 3600000 + Minute * 60000 + Second * 1000 + MilliSecond)
|
||||
else
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
Var
|
||||
T : TDateTime;
|
||||
|
||||
begin
|
||||
If TryEncodeTime(Hour,Minute,Second,MilliSecond,T) then
|
||||
Result:=trunc(T*MSecsPerDay)
|
||||
else
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
{==============================================================================}
|
||||
{ Public functions }
|
||||
@ -98,35 +89,59 @@ begin
|
||||
result := TimeStamp.Time + timestamp.date*msecsperday;
|
||||
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
|
||||
Date := DoEncodeDate(Year, Month, Day);
|
||||
Result:=(Date<>0);
|
||||
Result:=(Year>0) and (Year<10000) and
|
||||
(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;
|
||||
|
||||
function TryEncodeTime(Hour, Min, Sec, MSec:word; Var Time : TDateTime) : boolean;
|
||||
|
||||
function TryEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean;
|
||||
begin
|
||||
Time := DoEncodeTime(hour, Min, Sec, MSec) / MSecsPerDay;
|
||||
Result:=(Time<>0);
|
||||
Result:=(Hour<24) and (Min<60) and (Sec<60) and (MSec<1000);
|
||||
If Result then
|
||||
Time:=(Hour*3600000+Min*60000+Sec*1000+MSec)/MSecsPerDay;
|
||||
end;
|
||||
|
||||
{ EncodeDate packs three variables Year, Month and Day into a
|
||||
TDateTime value the result is the number of days since 12/30/1899 }
|
||||
|
||||
function EncodeDate(Year, Month, Day: word): TDateTime;
|
||||
|
||||
begin
|
||||
result := DoEncodeDate(Year, Month, Day);
|
||||
end ;
|
||||
If Not TryEncodeDate(Year,Month,Day,Result) then
|
||||
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
|
||||
a TDateTime value }
|
||||
|
||||
function EncodeTime(Hour, Minute, Second, MilliSecond:word):TDateTime;
|
||||
|
||||
begin
|
||||
Result := DoEncodeTime(hour, minute, second, millisecond) / MSecsPerDay;
|
||||
end ;
|
||||
If not TryEncodeTime(Hour,Minute,Second,MilliSecond,Result) then
|
||||
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:
|
||||
Year, Month and Day }
|
||||
@ -700,7 +715,10 @@ end;
|
||||
|
||||
{
|
||||
$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
|
||||
|
||||
Revision 1.7 2002/09/07 21:06:51 carl
|
||||
|
@ -28,9 +28,12 @@ type
|
||||
|
||||
const
|
||||
HoursPerDay = 24;
|
||||
MinsPerDay = HoursPerDay * 60;
|
||||
SecsPerDay = MinsPerDay * 60;
|
||||
MSecsPerDay = SecsPerDay * 1000;
|
||||
MinsPerHour = 60;
|
||||
SecsPerMin = 60;
|
||||
MSecsPerSec = 1000;
|
||||
MinsPerDay = HoursPerDay * MinsPerHour;
|
||||
SecsPerDay = MinsPerDay * SecsPerMin;
|
||||
MSecsPerDay = SecsPerDay * MSecsPerSec;
|
||||
|
||||
DateDelta = 693594; // Days between 1/1/0001 and 12/31/1899
|
||||
UnixDateDelta = 25569;
|
||||
@ -125,7 +128,10 @@ Procedure GetLocalTime(var SystemTime: TSystemTime);
|
||||
|
||||
{
|
||||
$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
|
||||
|
||||
Revision 1.6 2002/10/02 21:04:06 peter
|
||||
|
Loading…
Reference in New Issue
Block a user