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;
发布的原始代码未返回正确的时间。原始代码已替换为工作代码,以便其他人可以从中受益。
更新:由于所有这些辅助,代码现在提供了正确的时间。
最佳答案
该问题在MSDN文档中针对FileTimeToLocalFileTime突出显示:
FileTimeToLocalFileTime将当前设置用于时区和夏时制。因此,如果是夏令时,即使您转换的时间是标准时间,此功能也会考虑夏令时。您可以使用以下功能序列作为替代。
FileTimeToSystemTime / SystemTimeToTzSpecificLocalTime / SystemTimeToFileTime
每当您在更改夏令时之前创建的夏令时更改后查看文件时,都需要使用指定的三个功能(但是当您和文件创建都在夏令时更改的同一侧时,此方法当然也适用)。