在Delphi中将文件时间转换为Julian日期

时间:2012-12-30 14:34:45

标签: delphi delphi-2010

我在将文件修改时间视为julian日期时遇到问题。我的 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 !!

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

在LU RD&amp; amp; code posted here,我设法得到我想要的东西,以防有人需要这样的东西,这是我的代码:

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;