2012-11-01 3 views
1
function DateTimeToFileTime(FileTime: TDateTime): TFileTime; 
var 
    LocalFileTime, Ft: TFileTime; 
    SystemTime: TSystemTime; 
begin 
    Result.dwLowDateTime := 0; 
    Result.dwHighDateTime := 0; 
    DateTimeToSystemTime(FileTime, SystemTime); 
    SystemTimeToFileTime(SystemTime, LocalFileTime); 
    LocalFileTimeToFileTime(LocalFileTime, Ft); 
    Result := Ft; 
end; 

function ExtractShortDate(ATimeIn: TDateTime): string; 
// Convert DateTime to short date string 
begin 
    Result := FormatDateTime('mm/dd/yyyy', ATimeIn); 
end; 

function ExtractTime(ATimeIn: TDateTime): string; 
// Convert DateTime to am/pm time string 
begin 
    Result := FormatDateTime('hh:mm AM/PM', ATimeIn); 
end; 

function GetDateFileModified(AFileName: string): string; 
// Return the file modified date as a string in local time 
var 
    SR: TSearchRec; 
    UTCTime: Windows.TFileTime; 
    GMTST: Windows.TSystemTime; 
    LocalST: Windows.TSystemTime; 
    ModifyDT: TDateTime; 
    TZ: Windows._TIME_ZONE_INFORMATION; 
begin 
    Result := ''; 
    if FindFirst(AFileName, faAnyFile, SR) = 0 then 
    begin 
    UTCTime := SR.FindData.ftLastWriteTime; 
    if FileTimeToSystemTime(UTCTime, GMTST) then 
    begin 
     // Get Timezone Information 
     if GetTimeZoneInformation(TZ) <> 0 then 
     if SystemTimeToTzSpecificLocalTime(@TZ, GMTST, LocalST) then 
     begin 
      ModifyDT := SystemTimeToDateTime(LocalST); 
      Result := ExtractShortDate(ModifyDT) + ' ' + ExtractTime(ModifyDT); 
     end 
     else 
     begin 
      TaskMessageDlg('Unable To Convert Time', 'Unable to convert SystemTime To LocalTime', 
      mtInformation, [mbOk], 0); 
      Result := ''; 
      exit; 
     end; 
    end 
    else 
    begin 
     TaskMessageDlg('Unable To Convert Time', 'Unable to convert FileTime To SystemTime', 
     mtInformation, [mbOk], 0); 
     Result := ''; 
     exit; 
    end; 
    end 
    else 
    TaskMessageDlg('File Not Found', ExtractFileName(AFileName) + ' does not exist.', 
     mtInformation, [mbOk], 0); 
    FindClose(SR); 
end; 

게시 된 원본 코드가 올바른 시간을 반환하지 않았습니다. 원래 코드는 작동 코드로 대체되었으므로 다른 사람들이이 기능을 유용하게 사용할 수 있습니다.일광 절약 시간제 GetDateFileModified

업데이트 : 코드는 도움을 준 모든 사용자에게 정확한 시간을 제공합니다.

+0

파일이 NTFS 파일 시스템 (모든 파일 타임 스탬프는 UTC) 또는 FAT 파일 시스템 (일반적으로없는 위치)에 있습니까? – frogb

+0

NTFS 파일 시스템 – Bill

답변

3

문제는 FileTimeToLocalFileTime에 대한 MSDN의 문서에서 강조 표시됩니다 :

FileTimeToLocalFileTime는 시간을 절약 시간대와 일광에 대한 현재 설정을 사용합니다. 따라서 일광 절약 시간 인 경우 변환하는 시간이 표준 시간 인 경우에도이 함수는 일광 절약 시간을 고려합니다. 다음 순서로 함수를 사용할 수 있습니다.

FileTimeToSystemTime/SystemTimeToTzSpecificLocalTime/SystemTimeToFileTime 당신은 변경 전에 만들어진 일광 절약 변경 후 파일을보고 (그러나 물론이 방법은 또한 때를 작동 할 때마다 지정된 세 가지 기능을 사용할 필요가

파일 생성은 모두 일광 절약 시간 변경의 동일한 측면에 있습니다.

+0

"변경되기 전에 일광 절약 시간 변경이 만들어진 후 파일을 볼 때"를 어떻게 알 수 있습니까? TDateTIme로 시작하면 어떤 순서로 함수가 호출됩니까? – Bill

+0

@Bill : 당신은'FindFirst()'에서'FileTimeToSystemTime()'까지 원래의'FILETIME'을 전달한 다음'SystemTimeToTzSpecificLocalTime()'에 전달하여 로컬'SYSTEMTIME'을 얻습니다. 'SystemTimeToTzSpecificLocalTime()'이 모든 작업을 처리합니다. 변환을 수행 할 때 입력 'SYSTEMTIME'을 지정된 시간대의 표준 및 일광 시간 소인과 비교합니다. –

+0

@Bill : 파일이 로컬 컴퓨터 (또는 적어도 로컬 컴퓨터와 같은 시간대에있는 컴퓨터)에서 생성되었고 현재 연도에 'SystemTimeToTzSpecificLocalTim'의 lpTimeZone 매개 변수에 NULL을 전달할 수 있습니다()', 그렇지 않으면 원하는 연도의 원하는 시간대에 대해'TIME_ZONE_INFORMATION' 구조체를 제공해야합니다. 레지스트리 (여기에 설명 된대로) (http://msdn.microsoft.com/en-us/library/ms725481.aspx)에서 정보를 얻거나 온라인 시간대 웹 사이트를 사용하여 정보를 볼 수 있습니다 쪽으로. –

관련 문제