서버에 있는 파일과 로컬에 있는 파일의 '최종수정시간'을 비교하기 위해,
서버에선 php에서 filemtime 함수를 이용해 최종수정시간을 출력하고,
로컬에선 Delphi의 GetFileTime, DateTimeToUnix 를 이용하여 최종수정시간을 출력했는데,
이게 안맞았다.

이리저리 살펴본 결과 php의 filemtime은 GMT를 계산하지 않은 값이고,
로컬의 값은 GMT를 계산한 값이었다.
한국이니까 GMT+9 가 되어 있는 값이었다. 그러므로 -9시간을 해줘야 함.

GMT를 구해서 빼고 더하고 해서 php와 Delphi의 값을 맞춘다.


// TFileTime -> TDateTime
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
  ModifiedTime: TFileTime;
  SystemTime: TSystemTime;
begin
  FileTimeToLocalFileTime(FileTime, ModifiedTime);
  FileTimeToSystemTime(ModifiedTime, SystemTime);
  Result:=SystemTimeToDateTime(SystemTime);
end;

// GMT 값
function GetTimeZone: Integer;
var TimeZone: TTimeZoneInformation;
begin
  GetTimeZoneInformation(TimeZone);
  Result:=TimeZone.Bias div 60;
end;

// FilePath 파일의 최종수정시각을 UnixTime으로 반환. 파일이 없으면 -1
function GetModifiedUnixTime(FilePath: String): Integer;
var
  SR: TSearchRec;
  hFile: THandle;
  tCreate, tAccess, tModified: TFileTime;
begin
  Result:=-1;

  if not FileExists(FilePath) then Exit;

  hFile:=FileOpen(FilePath, fmOpenRead or fmShareDenyNone);
  GetFileTime(hFile, @tCreate, @tAccess, @tModified);
  Result:=DateTimeToUnix(IncHour(FileTimeToDateTime(tModified), GetTimeZone));
  FileClose(hfile);
  FindClose(SR);
end;







Posted by bloodguy
,