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()返された結果には1時間のオフセットがあります。ファイルの変更時刻が 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 に答える