1

How would it be to convert a SYSTEMTIME structure returned by GetLocalTime to time stamp ( seconds since 1970, ULONG )?

Jac0b
  • 163
  • 1
  • 10

1 Answers1

2

One way is to convert both the reference time and the target time to FILETIME structures, which then lets you perform simple arithmetic upon their values. These are measured in 100ns units and so you need to divide the final result by 10000000 to get number of seconds.

// reference time, convert to FILETIME
SYSTEMTIME stRef{};
stRef.wYear = 1970;
stRef.wMonth = 1;
stRef.wDay = 1;

FILETIME ftRef;
SystemTimeToFileTime(&stRef, &ftRef);


// target time, convert to FILETIME
SYSTEMTIME stTarget;
GetLocalTime(&stTarget);

FILETIME ftTarget;
SystemTimeToFileTime(&stTarget, &ftTarget);


// convert both to ULARGE_INTEGER
ULARGE_INTEGER ulRef, ulTarget;
ulRef.HighPart = ftRef.dwHighDateTime;
ulRef.LowPart = ftRef.dwLowDateTime;
ulTarget.HighPart = ftTarget.dwHighDateTime;
ulTarget.LowPart = ftTarget.dwLowDateTime;


// subtract reference time from target time
ulTarget.QuadPart -= ulRef.QuadPart;

// convert to seconds (divide by 10000000)
DWORD dwSecondsSinceRefTime = ulTarget.QuadPart / 10000000i64;
Jonathan Potter
  • 36,172
  • 4
  • 64
  • 79