如何将TDateTime转换为FILETIME?

问题描述 投票:0回答:3

标题说明了一切。互联网上充满了如何将FILETIME转换为TDateTime的示例,但没有相反的方法。

delphi delphi-xe5
3个回答
4
投票
  1. DateTimeToSystemTime呼叫System.SysUtils
  2. SystemTimeToFileTime呼叫Winapi.Windows

如果您的原始日期时间值是本地时间,则需要在调用DateTimeToSystemTime之前将其转换为UTC。


1
投票

您可以在ConvertDateTimeToFileTime中查看System.IOUtils的实现。它是TDirectory记录的私有成员。但是您可以将其用作参考,以便在一个功能中实现所需的全部功能。


-1
投票
function FileTimeToDateTime(AFileTime: FILETIME): TDateTime;
var
    li: ULARGE_INTEGER;
    systemTime: TSystemTime;
    localTime: TSystemTime;
const
    OA_ZERO_TICKS = UInt64(94353120000000000);
    TICKS_PER_DAY = UInt64(864000000000);
begin
    // Convert a FILETIME (which is UTC by definition), into a UTC TDateTime.

    // Copy FILETIME into LARGE_INTEGER to allow UInt64 access without alignment faults.
    li.LowPart := AFileTime.dwLowDateTime;
    li.HighPart := AFileTime.dwHighDateTime;
    Result := (Real(li.QuadPart) - OA_ZERO_TICKS) / TICKS_PER_DAY;
end;

function DateTimeToFileTime(ADateTimeUTC: TDateTime): FILETIME;
var
    li: ULARGE_INTEGER;
    systemTime: TSystemTime;
    localTime: TSystemTime;
const
    OA_ZERO_TICKS = UInt64(94353120000000000);
    TICKS_PER_DAY = UInt64(864000000000);
begin
    // Convert a UTC TDateTime into a FILETIME (which is UTC by definition).

    li.QuadPart := Round(ADateTimeUtc*TICKS_PER_DAY + OA_ZERO_TICKS);
    Result.dwLowDateTime := li.LowPart;
    Result.dwHighDateTime := li.HighPart;
end;

通过避免SYSTEMTIME,我们避免了SYSTEMTIME

根据定义,SYSTEMTIME的dwMilliseconds限制为1毫秒。

losing precision in milliseconds.

您应避免使用| FILETIME | SYSTEMTIME | |--------------------------------|-------------------------| | 100ns resolution | 1,000,000 ns resolution | | GetSystemTimeAsFileTime | GetSystemTime | | GetSystemTimePreciseAsFileTime | n/a | | -- FileTimeToSystemTime --> | | <-- SystemTimeToFileTime -- | SYSTEMTIME的目的是为您将日期/时间解码为其组成部分:

  • 年,月,日,小时,分钟,秒,毫秒

奖励阅读

© www.soinside.com 2019 - 2024. All rights reserved.