diff options
author | ondrej <ondrej@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-10-26 20:39:21 +0000 |
---|---|---|
committer | ondrej <ondrej@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-10-26 20:39:21 +0000 |
commit | 78f55b0c3ec762d50ce9e22182759356b833857c (patch) | |
tree | 7a1b3ea07e9fa467c173f9f8383465aaf54b64ef /rtl/objpas | |
parent | 497096e59010f2a96a096729037ad4b82a0dae82 (diff) | |
download | fpc-78f55b0c3ec762d50ce9e22182759356b833857c.tar.gz |
File datetime UTC support
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@47210 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'rtl/objpas')
-rw-r--r-- | rtl/objpas/sysutils/dati.inc | 52 | ||||
-rw-r--r-- | rtl/objpas/sysutils/datih.inc | 8 | ||||
-rw-r--r-- | rtl/objpas/sysutils/filutil.inc | 80 | ||||
-rw-r--r-- | rtl/objpas/sysutils/filutilh.inc | 6 |
4 files changed, 146 insertions, 0 deletions
diff --git a/rtl/objpas/sysutils/dati.inc b/rtl/objpas/sysutils/dati.inc index b1e0e73858..835061fe71 100644 --- a/rtl/objpas/sysutils/dati.inc +++ b/rtl/objpas/sysutils/dati.inc @@ -1286,6 +1286,21 @@ begin end; {$endif unix} +Function FileDateToUTC (Filedate : Int64) : TDateTime; + +{$ifndef unix} +begin + Result := LocalTimeToUniversal(FileDateToDateTime(Filedate)); +end; +{$else unix} +var + y, mon, d, h, min, s: word; +begin + EpochToUniversal(FileDate,y,mon,d,h,min,s); + Result:=ComposeDateTime(EncodeDate(y,mon,d),EncodeTime(h,min,s,0)); +end; +{$endif unix} + function TryStrToDate(const S: ShortString; out Value: TDateTime): Boolean; begin result := TryStrToDate(S, Value, #0); @@ -1521,3 +1536,40 @@ begin if not GetLocalTimeOffset(DateTime, Result) then Result:=GetLocalTimeOffset; end; + +{ Conversion of UTC to local time and vice versa } + +function UniversalTimeToLocal(UT: TDateTime): TDateTime; + +begin + Result:=UniversalTimeToLocal(UT,-GetLocalTimeOffset(UT)); +end; + +function UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime; + +begin + if (TZOffset > 0) then + Result := UT + EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0) + else if (TZOffset < 0) then + Result := UT - EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0, 0) + else + Result := UT; +end; + +Function LocalTimeToUniversal(LT: TDateTime): TDateTime; + +begin + Result:=LocalTimeToUniversal(LT,-GetLocalTimeOffset(LT)); +end; + +Function LocalTimeToUniversal(LT: TDateTime;TZOffset: Integer): TDateTime; + +begin + if (TZOffset > 0) then + Result := LT - EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0) + else if (TZOffset < 0) then + Result := LT + EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0, 0) + else + Result := LT; +end; + diff --git a/rtl/objpas/sysutils/datih.inc b/rtl/objpas/sysutils/datih.inc index 6d7953b2eb..e0137de16e 100644 --- a/rtl/objpas/sysutils/datih.inc +++ b/rtl/objpas/sysutils/datih.inc @@ -203,3 +203,11 @@ function GetLocalTimeOffset: Integer; function GetLocalTimeOffset(const DateTime: TDateTime; out Offset: Integer): Boolean; function GetLocalTimeOffset(const DateTime: TDateTime): Integer; +Function FileDateToUTC (Filedate : Int64) : TDateTime; + +{ UTC <-> Local time } +Function UniversalTimeToLocal(UT: TDateTime): TDateTime; +Function UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime; +Function LocalTimeToUniversal(LT: TDateTime): TDateTime; +Function LocalTimeToUniversal(LT: TDateTime; TZOffset: Integer): TDateTime; + diff --git a/rtl/objpas/sysutils/filutil.inc b/rtl/objpas/sysutils/filutil.inc index cb1612ea2a..e0a928fd44 100644 --- a/rtl/objpas/sysutils/filutil.inc +++ b/rtl/objpas/sysutils/filutil.inc @@ -119,12 +119,38 @@ begin end; +function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean; +Var + Info : TRawByteSearchRec; + A : Integer; +begin + for A:=1 to Length(FileName) do + if CharInSet(FileName[A],['?','*']) then + Exit(False); + A:=0; + if not FollowLink then + A:=A or faSymLink; + Result:=FindFirst(FileName,A,Info)=0; + if Result then + begin + FileDateTimeUTC:=FileDateToUTC(Info.Time); + FindClose(Info); + end; +end; + + Function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean; begin Result:=FileAge(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTime,FollowLink); end; +Function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean; +begin + Result:=FileAgeUTC(ToSingleByteFileSystemEncodedFileName(FileName),FileDateTimeUTC,FollowLink); +end; + + function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean; var sr: TRawbyteSymLinkRec; @@ -334,12 +360,39 @@ begin end; +function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean; +Var + Info : TUnicodeSearchRec; + A : Integer; + +begin + for A:=1 to Length(FileName) do + if CharInSet(FileName[A],['?','*']) then + Exit(False); + A:=0; + if not FollowLink then + A:=A or faSymLink; + Result:=FindFirst(FileName,A,Info)=0; + if Result then + begin + FileDateTimeUTC:=Info.TimeStampUTC; + FindClose(Info); + end; +end; + + Function FileAge(const FileName: RawbyteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean; begin Result:=FileAge(UnicodeString(FileName),FileDateTime,FollowLink); end; +function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean; +begin + Result:=FileAgeUTC(UnicodeString(FileName),FileDateTimeUTC,FollowLink); +end; + + function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean; var sr: TUnicodeSymLinkRec; @@ -617,6 +670,15 @@ begin aResult := SystemTimeToDateTime(st); end; end; + +function FindDataTimeToUTC(constref aFileTime: FILETIME; out aResult: TDateTime): Boolean; +var + st: TSystemTime; +begin + Result := FileTimeToSystemTime(aFileTime, st); + if Result then + aResult := SystemTimeToDateTime(st); +end; {$endif} { TUnicodeSearchRec } @@ -630,6 +692,15 @@ begin {$endif} end; +function TUnicodeSearchRec.GetTimeStampUTC: TDateTime; +begin +{$if declared(FindDataTimeToUTC)} + if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then +{$else} + Result := FileDateToUTC(Time); +{$endif} +end; + { TRawbyteSearchRec } function TRawbyteSearchRec.GetTimeStamp: TDateTime; @@ -641,6 +712,15 @@ begin {$endif} end; +function TRawbyteSearchRec.GetTimeStampUTC: TDateTime; +begin +{$if declared(FindDataTimeToDateTime)} + if not FindDataTimeToUTC(FindData.ftLastWriteTime, Result) then +{$else} + Result := FileDateToUTC(Time); +{$endif} +end; + { TUnicodeSymLinkRec } function TUnicodeSymLinkRec.GetTimeStamp: TDateTime; diff --git a/rtl/objpas/sysutils/filutilh.inc b/rtl/objpas/sysutils/filutilh.inc index 7d26bd18d9..741134e96a 100644 --- a/rtl/objpas/sysutils/filutilh.inc +++ b/rtl/objpas/sysutils/filutilh.inc @@ -60,8 +60,10 @@ Type {$endif} private function GetTimeStamp: TDateTime; + function GetTimeStampUTC: TDateTime; public property TimeStamp: TDateTime read GetTimeStamp; + property TimeStampUTC: TDateTime read GetTimeStampUTC; end; TRawbyteSearchRec = Record @@ -79,8 +81,10 @@ Type {$ENDIF} private function GetTimeStamp: TDateTime; + function GetTimeStampUTC: TDateTime; public property TimeStamp: TDateTime read GetTimeStamp; + property TimeStampUTC: TDateTime read GetTimeStampUTC; end; {$IFDEF FPC_UNICODE_RTL} @@ -190,6 +194,7 @@ Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : B Function ExeSearch (Const Name : UnicodeString; Const DirList : UnicodeString = '') : UnicodeString; Function FileIsReadOnly(const FileName : UnicodeString): Boolean; function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean; +function FileAgeUTC(const FileName: UnicodeString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean; function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean; function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean; inline; @@ -210,6 +215,7 @@ Function FileSearch (Const Name, DirList : RawByteString; ImplicitCurrentDir : B Function ExeSearch (Const Name : RawByteString; Const DirList : RawByteString = '') : RawByteString; Function FileIsReadOnly(const FileName: RawByteString): Boolean; function FileAge(const FileName: RawByteString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean; +function FileAgeUTC(const FileName: RawByteString; out FileDateTimeUTC: TDateTime; FollowLink: Boolean = True): Boolean; {$ifndef FPUNONE} Function FileAge (Const FileName : RawByteString): Int64; {$endif} |