Delphi:将某些文件的文件时间戳设置错误一小时

我想更正某些文件的最后访问时间。 对于某些文件,以编程方式执行此操作将失败一小时。 神秘,因为我确实根据时区更正了日期。

这里是一个示例,已针对Delphi2010(这是我需要的代码)和Delphi10.3进行了测试

function GetTempDir : string;
var path : array[0..MAX_PATH] of char;
    PathStr : string;
begin
     GetTempPath(MAX_PATH,path);
     PathStr:=path;
     result:=IncludeTrailingPathDelimiter(PathStr);
end;

function UTCDateTimeFromLocalDateTime(const LocalDateTime: TDateTime): TDateTime;
var
  LocalSystemTime: TSystemTime;
  UTCSystemTime: TSystemTime;
  LocalFileTime: TFileTime;
  UTcfileTime: TFileTime;
begin
  DateTimeToSystemTime(LocalDateTime,UTCSystemTime);
  SystemTimeToFileTime(UTCSystemTime,UTcfileTime);

  if LocalFileTimeToFileTime(UTcfileTime,LocalFileTime)
  and FileTimeToSystemTime(LocalFileTime,LocalSystemTime) then begin
    Result := SystemTimeToDateTime(LocalSystemTime);
  end else begin
    Result := LocalDateTime;
  end;
end;

function setfileTimesHelper(const FileName: string; DateTime: TDateTime): Boolean;
var
  Handle: THandle;
  FileTime: TFileTime;
  SystemTime: TSystemTime;
begin
  Result := False;
  Handle := CreateFile(pchar(FileName),GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,0);
  if Handle <> INVALID_HANDLE_VALUE then
  try
    DateTime:=UTCDateTimeFromLocalDateTime(DateTime);
    DateTimeToSystemTime(DateTime,SystemTime);
    FileTime.dwLowDateTime := 0;
    FileTime.dwHighDateTime := 0;
    if SystemTimeToFileTime(SystemTime,FileTime) then
    begin
          Result := setfileTime(Handle,@FileTime);
    end;
  finally
    CloseHandle(Handle);
  end;
end;


procedure TForm1.CreateDateFile(Dat : TDateTime);
var FileName : string;
begin
     FileName:=GetTempDir+FormatDateTime('yyyymmdd hhnnss',Dat)+'.txt';
     Memo1.Lines.Add(FileName);
     with TStringList.Create do
     begin
          text:='1';
          SaveToFile(FileName);
          Free;
     end;

     setfileTimesHelper(FileName,Dat);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     CreateDateFile(StrToDateTime('23.02.2013 11:11:11'));
     CreateDateFile(StrToDateTime('06.05.2014 22:22:22'));      // file dated 23:22:22
end;

第一个文件的日期正确,第二个文件在Windows资源管理器中显示为23:22:22。 我想念什么?

sagaxu 回答:Delphi:将某些文件的文件时间戳设置错误一小时

感谢brian的评论。 通过这种方式,我找到了解决方案:

def bmi(height,weight):

  height = int(input("Input your height in meters: "))
  weight = int(input("Input your weight in kilogram: "))
  result = (weight + height)
  return result
print("Your body mass index is: ",round(weight / (height * height),2))

我没有找到SystemTimeToTzSpecificLocalTime的反函数,但是我使用了此函数,然后看到了产生的偏移量。然后,我将偏移量反转,并且时间已正确校正。

本文链接:https://www.f2er.com/3078105.html

大家都在问