summaryrefslogtreecommitdiff
path: root/rtl/objpas
diff options
context:
space:
mode:
authorondrej <ondrej@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-10-26 20:39:21 +0000
committerondrej <ondrej@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-10-26 20:39:21 +0000
commit78f55b0c3ec762d50ce9e22182759356b833857c (patch)
tree7a1b3ea07e9fa467c173f9f8383465aaf54b64ef /rtl/objpas
parent497096e59010f2a96a096729037ad4b82a0dae82 (diff)
downloadfpc-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.inc52
-rw-r--r--rtl/objpas/sysutils/datih.inc8
-rw-r--r--rtl/objpas/sysutils/filutil.inc80
-rw-r--r--rtl/objpas/sysutils/filutilh.inc6
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}