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;

投稿された元のコードは正しい時刻を返しませんでした。元のコードは動作するコードに置き換えられたので、他の人がこれを有益だと思うかもしれません。

更新:コードは、支援されたすべてのおかげで、正しい時刻を提供するようになりました。

4

1 に答える 1

4

この問題は、FileTimeToLocalFileTime の MSDN ドキュメントで強調表示されています。

FileTimeToLocalFileTime は、タイム ゾーンと夏時間の現在の設定を使用します。そのため、夏時間の場合、変換する時間が標準時間であっても、この関数は夏時間を考慮します。代わりに、次の一連の関数を使用できます。

FileTimeToSystemTime / SystemTimeToTzSpecificLocalTime / SystemTimeToFileTime

変更前に作成された夏時間変更後のファイルを見るときは常に、指定された 3 つの関数を使用する必要があります (ただし、この方法はもちろん、あなたとファイル作成の両方が夏時間変更の同じ側にある場合にも機能します) )。

于 2012-11-01T16:07:13.863 に答える