diff --git a/lib/winapi/timezoneapi.c b/lib/winapi/timezoneapi.c index fd8931605..85b52ebed 100644 --- a/lib/winapi/timezoneapi.c +++ b/lib/winapi/timezoneapi.c @@ -296,3 +296,29 @@ BOOL FileTimeToLocalFileTime (const FILETIME *lpFileTime, LPFILETIME lpLocalFile lpLocalFileTime->dwHighDateTime = fileTime.HighPart; return TRUE; } + +BOOL LocalFileTimeToFileTime (const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime) +{ + if (!lpLocalFileTime || !lpFileTime) { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + TIME_ZONE_INFORMATION timeZoneInformation; + GetTimeZoneInformation(&timeZoneInformation); + + // Get the timezone offset bias in 100-nanosecond intervals + LARGE_INTEGER offset; + offset.QuadPart = timeZoneInformation.Bias; + offset.QuadPart *= 60LL * 10000000LL; + + LARGE_INTEGER localFileTime; + localFileTime.LowPart = lpLocalFileTime->dwLowDateTime; + localFileTime.HighPart = lpLocalFileTime->dwHighDateTime; + + localFileTime.QuadPart += offset.QuadPart; + + lpFileTime->dwLowDateTime = localFileTime.LowPart; + lpFileTime->dwHighDateTime = localFileTime.HighPart; + return TRUE; +} diff --git a/lib/winapi/timezoneapi.h b/lib/winapi/timezoneapi.h index 3d9ccc288..3ce6b77ff 100644 --- a/lib/winapi/timezoneapi.h +++ b/lib/winapi/timezoneapi.h @@ -33,6 +33,7 @@ DWORD GetTimeZoneInformation (LPTIME_ZONE_INFORMATION lpTimeZoneInformation); BOOL FileTimeToSystemTime (const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime); BOOL SystemTimeToFileTime (const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); BOOL FileTimeToLocalFileTime (const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime); +BOOL LocalFileTimeToFileTime (const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime); #ifdef __cplusplus }