0

我在将文件修改时间作为朱利安日期时遇到问题。我的Delphi 2010看起来像这样:

AHandle := FindFirstFile(PChar('C:\*'), FindData);
if (AHandle <> INVALID_HANDLE_VALUE) then
begin
     repeat
           if (FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY = 0) then
                ModifJulianDate := FileTimeToJulianDate(FindData.ftLastWriteTime);

     until Not FindNextFile(AHandle, FindData);
end;

问题是:FileTimeToJulianDate()返回的结果有一个小时的偏移量,即。如果文件的修改时间是 10:01,则​​此代码返回 9:01!!

我怎样才能解决这个问题?

4

2 回答 2

3

假设您的答案准确,您正在寻找的功能最容易使用 FileTimeToLocalFileTime 实现。

function UTCFileTimeToLocalDateTime(const UTCFileTime: TFileTime): TDateTime;
var
  LocalFileTime: TFileTime;
  LocalSystemTime: TSystemTime;
begin
  if not FileTimeToLocalFileTime(UTCFileTime, LocalFileTime) then
    RaiseLastOSError;
  if not FileTimeToSystemTime(LocalFileTime, LocalSystemTime) then
    RaiseLastOSError;
  Result := SystemTimeToDateTime(LocalSystemTime);
end;

或者,如果您更喜欢使用 SystemTimeToTzSpecificLocalTime ,请这样做:

function UTCFileTimeToLocalDateTime(const UTCFileTime: TFileTime): TDateTime;
var
  UTCSystemTime, LocalSystemTime: TSystemTime;
begin
  if not FileTimeToSystemTime(UTCFileTime, UTCSystemTime) then
    RaiseLastOSError;
  if not SystemTimeToTzSpecificLocalTime(nil, UTCSystemTime, LocalSystemTime) then
    RaiseLastOSError;
  Result := SystemTimeToDateTime(LocalSystemTime);
end;
于 2012-12-30T22:57:38.720 回答
1

在 LU RD 和此处发布的代码的帮助下,我设法得到了我想要的东西,以防有人需要这样的东西,这是我的代码:

function GetDateFileModified(UTCTime : TFileTime{FindData : TWin32FindData}) : TDateTime;
// Return the file modified date as a string in local time
var
   GMTsystemTime : Windows.TSystemTime;
   LocalSysTime  : Windows.TSystemTime;
   TimeZone      : Windows._TIME_ZONE_INFORMATION;
begin
     Result  := 0;

     // Get Timezone Information
     GetTimeZoneInformation(TimeZone);

     // UTCTime := FindData.ftLastWriteTime;
     if FileTimeToSystemTime(UTCTime, GMTsystemTime) then
     begin
          SystemTimeToTzSpecificLocalTime(@TimeZone, GMTsystemTime, LocalSysTime);
          Result := SystemTimeToDateTime(LocalSysTime);
     end;
end;
于 2012-12-30T20:48:55.830 回答