From 35c5b75792f5e5381004a58615d269e73a5c7fa3 Mon Sep 17 00:00:00 2001 From: joost Date: Fri, 26 May 2006 20:55:03 +0000 Subject: [PATCH] + Several dateutil-fixes for dates before 1899/12/30 git-svn-id: trunk@3687 - --- rtl/objpas/sysutils/dati.inc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/rtl/objpas/sysutils/dati.inc b/rtl/objpas/sysutils/dati.inc index f031893e85..1331f44ab9 100644 --- a/rtl/objpas/sysutils/dati.inc +++ b/rtl/objpas/sysutils/dati.inc @@ -43,6 +43,13 @@ begin Result:=0; end; +function ComposeDateTime(Date,Time : TDateTime) : TDateTime; + +begin + if Date < 0 then Result := Date - Time + else Result := Date + Time; +end; + {==============================================================================} { Public functions } {==============================================================================} @@ -59,8 +66,8 @@ end ; function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime; begin - result := (TimeStamp.Date - DateDelta) + (TimeStamp.Time / MSecsPerDay); -end ; + Result := ComposeDateTime(TimeStamp.Date - DateDelta,TimeStamp.Time / MSecsPerDay) +end; { MSecsToTimeStamp } @@ -210,8 +217,8 @@ end ; function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime; begin - result := DoEncodeDate(SystemTime.Year, SystemTime.Month, SystemTime.Day) + - DoEncodeTime(SystemTime.Hour, SystemTime.Minute, SystemTime.Second, SystemTime.MilliSecond); + result := ComposeDateTime(DoEncodeDate(SystemTime.Year, SystemTime.Month, SystemTime.Day), + DoEncodeTime(SystemTime.Hour, SystemTime.Minute, SystemTime.Second, SystemTime.MilliSecond)); end ; { DayOfWeek returns the Day of the week (sunday is day 1) } @@ -481,7 +488,7 @@ function StrToDateTime(const s: string): TDateTime; var i: integer; begin i := pos(' ', s); -if i > 0 then result := StrToDate(Copy(S, 1, i - 1)) + StrToTime(Copy(S, i + 1, length(S))) +if i > 0 then result := ComposeDateTime(StrToDate(Copy(S, 1, i - 1)), StrToTime(Copy(S, i + 1, length(S)))) else result := StrToDate(S); end ; @@ -697,9 +704,8 @@ var end ; begin - DecodeDate(DateTime, Year, Month, Day); + DecodeDateFully(DateTime, Year, Month, Day, DayOfWeek); DecodeTime(DateTime, Hour, Minute, Second, MilliSecond); - DayOfWeek := SysUtils.DayOfWeek(DateTime); ResultLen := 0; ResultCurrent := @ResultBuffer; StoreFormat(FormatStr); @@ -721,17 +727,16 @@ Var YY,MM,DD,H,m,s,msec : Word; begin Decodedate (DateTime,YY,MM,DD); + DecodeTime (DateTime,h,m,s,msec); {$ifndef unix} If (YY<1980) or (YY>2099) then Result:=0 else begin - DecodeTime (DateTime,h,m,s,msec); Result:=(s shr 1) or (m shl 5) or (h shl 11); Result:=Result or DD shl 16 or (MM shl 21) or ((YY-1980) shl 25); end; {$else unix} - Decodetime(DateTime,h,m,s,msec); Result:=LocalToEpoch(yy,mm,dd,h,m,s); {$endif unix} end; @@ -751,15 +756,15 @@ Var Date,Time : Word; begin Date:=FileDate shr 16; Time:=FileDate and $ffff; - Result:=EncodeDate((Date shr 9) + 1980,(Date shr 5) and 15, Date and 31) + - EncodeTime(Time shr 11, (Time shr 5) and 63, (Time and 31) shl 1,0); + Result:=ComposeDate(EncodeDate((Date shr 9) + 1980,(Date shr 5) and 15, Date and 31), + EncodeTime(Time shr 11, (Time shr 5) and 63, (Time and 31) shl 1,0)); end; {$else unix} var y, mon, d, h, min, s: word; begin EpochToLocal(FileDate,y,mon,d,h,min,s); - Result:=EncodeDate(y,mon,d) + EncodeTime(h,min,s,0); + Result:=ComposeDateTime(EncodeDate(y,mon,d),EncodeTime(h,min,s,0)); end; {$endif unix}