GetDateFileModified为夏令时 [英] GetDateFileModified for Daylight Savings Time

查看:98
本文介绍了GetDateFileModified为夏令时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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;

发布的原始代码未返回正确的时间。原始代码已替换为工作代码,以便其他人可以从中受益。

The original code posted did not return the correct time. The original code was replaced with working code so that others may find this beneficial.

更新:由于所有人,该代码现在提供了正确的时间

Update: The code provides the correct time now thanks to all that assisted.

推荐答案

问题在MSDN文档中针对FileTimeToLocalFileTime突出显示:

The problem is highlighted in the MSDN docs for FileTimeToLocalFileTime:


FileTimeToLocalFileTime使用时区和夏时制的当前设置。因此,如果是夏令时,即使您转换的时间是标准时间,此功能也会考虑夏令时。您可以使用以下函数序列作为替代。

FileTimeToLocalFileTime uses the current settings for the time zone and daylight saving time. Therefore, if it is daylight saving time, this function will take daylight saving time into account, even if the time you are converting is in standard time. You can use the following sequence of functions as an alternative.

FileTimeToSystemTime / SystemTimeToTzSpecificLocalTime / SystemTimeToFileTime

FileTimeToSystemTime / SystemTimeToTzSpecificLocalTime / SystemTimeToFileTime

在更改前创建的夏令时之后,每次查看文件时都需要使用指定的三个功能(但是当您和文件创建都在同一侧时,此方法当然也适用的夏令时变化)。

You need to use the three functions specified whenever you look at a file after a daylight savings change that was created before the change (but this method of course also works when you and the file creation are both on the same side of the daylight savings change).

这篇关于GetDateFileModified为夏令时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆