mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 20:29:17 +02:00
* SMall fixes to date/time routines
This commit is contained in:
parent
73b21ccda9
commit
b96ade9fef
@ -74,15 +74,16 @@ end ;
|
|||||||
|
|
||||||
function MSecsToTimeStamp(MSecs: comp): TTimeStamp;
|
function MSecsToTimeStamp(MSecs: comp): TTimeStamp;
|
||||||
begin
|
begin
|
||||||
result.Time := Trunc(MSecs);
|
result.Date := trunc(msecs / msecsperday);
|
||||||
result.Date := 0;
|
msecs:= msecs - result.date * msecsperday;
|
||||||
|
result.Time := Trunc(MSecs);
|
||||||
end ;
|
end ;
|
||||||
|
|
||||||
{ TimeStampToMSecs }
|
{ TimeStampToMSecs }
|
||||||
|
|
||||||
function TimeStampToMSecs(const TimeStamp: TTimeStamp): comp;
|
function TimeStampToMSecs(const TimeStamp: TTimeStamp): comp;
|
||||||
begin
|
begin
|
||||||
result := TimeStamp.Time;
|
result := TimeStamp.Time + timestamp.date*msecsperday;
|
||||||
end ;
|
end ;
|
||||||
|
|
||||||
{ EncodeDate packs three variables Year, Month and Day into a
|
{ EncodeDate packs three variables Year, Month and Day into a
|
||||||
@ -217,14 +218,16 @@ end ;
|
|||||||
|
|
||||||
function IncMonth(const DateTime: TDateTime; NumberOfMonths: integer): TDateTime;
|
function IncMonth(const DateTime: TDateTime; NumberOfMonths: integer): TDateTime;
|
||||||
var Year, Month, Day: word;
|
var Year, Month, Day: word;
|
||||||
|
S : Integer;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
If NumberOfMonths>=0 then s:=1 else s:=-1;
|
||||||
DecodeDate(DateTime, Year, Month, Day);
|
DecodeDate(DateTime, Year, Month, Day);
|
||||||
Month := Month - 1 + NumberOfMonths; { Months from 0 to 11 }
|
|
||||||
Year := Year + (NumberOfMonths div 12);
|
Year := Year + (NumberOfMonths div 12);
|
||||||
Month := Month mod 12;
|
Month := Month + (NumberOfMonths mod 12)-1 ; // Mod result always positive
|
||||||
if Month < 0 then begin
|
if Month>11 then begin
|
||||||
Inc(Month, 12);
|
Dec(Month, S*12);
|
||||||
Inc(Year, 1);
|
Inc(Year, S);
|
||||||
end ;
|
end ;
|
||||||
Inc(Month, 1); { Months from 1 to 12 }
|
Inc(Month, 1); { Months from 1 to 12 }
|
||||||
if (Month = 2) and (IsLeapYear(Year)) and (Day > 28) then
|
if (Month = 2) and (IsLeapYear(Year)) and (Day > 28) then
|
||||||
@ -265,15 +268,31 @@ end ;
|
|||||||
an EConvertError will be raised }
|
an EConvertError will be raised }
|
||||||
|
|
||||||
function StrToDate(const S: string): TDateTime;
|
function StrToDate(const S: string): TDateTime;
|
||||||
|
|
||||||
var
|
var
|
||||||
df:string;
|
df:string;
|
||||||
d,m,y:word;n,i:longint;c:word;
|
d,m,y:word;
|
||||||
|
n,i:longint;
|
||||||
|
c:word;
|
||||||
|
dp,mp,yp,which : Byte;
|
||||||
s1:string[4];
|
s1:string[4];
|
||||||
values:array[0..2] of longint;
|
values:array[0..2] of longint;
|
||||||
LocalTime:tsystemtime;
|
LocalTime:tsystemtime;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
df := UpperCase(ShortDateFormat);
|
df := UpperCase(ShortDateFormat);
|
||||||
d := 0;m := 0;y := 0;
|
{ Determine order of D,M,Y }
|
||||||
|
Which:=0;
|
||||||
|
For I:=1 to Length(df) do
|
||||||
|
Case df[i] of
|
||||||
|
'Y' : yp:=which;
|
||||||
|
'M' : mp:=which;
|
||||||
|
'D' : dp:=which;
|
||||||
|
else
|
||||||
|
If df[i]=DateSeparator then
|
||||||
|
Inc(Which);
|
||||||
|
end;
|
||||||
|
{ Get actual values }
|
||||||
for i := 0 to 2 do values[i] := 0;
|
for i := 0 to 2 do values[i] := 0;
|
||||||
s1 := '';
|
s1 := '';
|
||||||
n := 0;
|
n := 0;
|
||||||
@ -281,43 +300,40 @@ for i := 1 to length(s) do begin
|
|||||||
if (s[i] in ['0'..'9']) then s1 := s1 + s[i];
|
if (s[i] in ['0'..'9']) then s1 := s1 + s[i];
|
||||||
if (s[i] in [dateseparator,' ']) or (i = length(s)) then begin
|
if (s[i] in [dateseparator,' ']) or (i = length(s)) then begin
|
||||||
val(s1, values[n], c);
|
val(s1, values[n], c);
|
||||||
|
if c<>0 then
|
||||||
|
Raise EConvertError.Create('Invalid date format');
|
||||||
s1 := '';
|
s1 := '';
|
||||||
inc(n);
|
inc(n);
|
||||||
end ;
|
end ;
|
||||||
end ;
|
end ;
|
||||||
if (df = 'D/M/Y') then begin
|
// Fill in values.
|
||||||
d := values[0];
|
If N=3 then
|
||||||
m := values[1];
|
begin
|
||||||
y := values[2];
|
y:=values[yp];
|
||||||
end
|
m:=values[mp];
|
||||||
else if (df = 'M/D/Y') then begin
|
d:=values[dp];
|
||||||
if (n > 1) then begin
|
end
|
||||||
m := values[0];
|
Else
|
||||||
d := values[1];
|
begin
|
||||||
y := values[2];
|
getLocalTime(LocalTime);
|
||||||
|
y := LocalTime.Year;
|
||||||
|
If n<2 then
|
||||||
|
begin
|
||||||
|
d:=values[0];
|
||||||
|
m := LocalTime.Month;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
If dp<mp then
|
||||||
|
begin
|
||||||
|
d:=values[0];
|
||||||
|
m:=values[1];
|
||||||
end
|
end
|
||||||
else { if there is just one value, it is the day of the month }
|
else
|
||||||
d := values[0];
|
begin
|
||||||
end
|
d:=values[1];
|
||||||
else if (df = 'Y/M/D') then begin
|
m:=values[0];
|
||||||
if (n = 3) then begin
|
end;
|
||||||
y := values[0];
|
end;
|
||||||
m := values[1];
|
|
||||||
d := values[2];
|
|
||||||
end
|
|
||||||
else if (n = 2) then begin
|
|
||||||
m := values[0];
|
|
||||||
d := values[1];
|
|
||||||
end
|
|
||||||
else if (n = 1) then
|
|
||||||
d := values[0];
|
|
||||||
end ;
|
|
||||||
if (n < 3) then begin
|
|
||||||
getLocalTime(LocalTime);
|
|
||||||
y := LocalTime.Year;
|
|
||||||
if (n < 2) then
|
|
||||||
m := LocalTime.Month;
|
|
||||||
end ;
|
|
||||||
if (y >= 0) and (y < 100) then y := 1900 + y;
|
if (y >= 0) and (y < 100) then y := 1900 + y;
|
||||||
Result := DoEncodeDate(y, m, d);
|
Result := DoEncodeDate(y, m, d);
|
||||||
end ;
|
end ;
|
||||||
@ -606,7 +622,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.10 1999-04-18 19:03:03 michael
|
Revision 1.11 1999-05-11 09:05:13 michael
|
||||||
|
* SMall fixes to date/time routines
|
||||||
|
|
||||||
|
Revision 1.10 1999/04/18 19:03:03 michael
|
||||||
+ Now EConvertError is used everywhere in conversions
|
+ Now EConvertError is used everywhere in conversions
|
||||||
|
|
||||||
Revision 1.9 1999/04/08 11:31:02 peter
|
Revision 1.9 1999/04/08 11:31:02 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user