diff --git a/libs/spandsp/src/msvc/gettimeofday.c b/libs/spandsp/src/msvc/gettimeofday.c index c59f19e0b8..66422e1087 100644 --- a/libs/spandsp/src/msvc/gettimeofday.c +++ b/libs/spandsp/src/msvc/gettimeofday.c @@ -4,11 +4,33 @@ #include "windows.h" +const unsigned long long int DELTA_EPOCH_IN_MICROSECS = 11644473600000000LLU + void gettimeofday(struct timeval *tv, void *tz) { - long int l = GetTickCount(); - - tv->tv_sec = l / 1000; - tv->tv_usec = (l % 1000) * 1000; - return; -} + FILETIME ft; + unsigned long long int highResolutionTime; + TIME_ZONE_INFORMATION tz_winapi; + int result_tz; + long long int timezone_time_bias_in_minutes; + + ZeroMemory(&ft, sizeof(ft)); + ZeroMemory(&tz_winapi, sizeof(tz_winapi)); + + GetSystemTimeAsFileTime(&ft); + result_tz = GetTimeZoneInformation(&tz_winapi); + timezone_time_bias_in_minutes = tz_winapi.Bias + ((result_tz == TIME_ZONE_ID_DAYLIGHT) ? tz_winapi.DaylightBias : 0); + + highResolutionTime = ft.dwHighDateTime; + highResolutionTime <<= 32; + highResolutionTime |= ft.dwLowDateTime; + + /* Converting file time to unix epoch */ + /* Convert to microseconds */ + highResolutionTime /= 10; + /* Add timezone bias conververt from minutes to microsecond */ + highResolutionTime -= timezone_time_bias_in_minutes*60*1000000; + highResolutionTime -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (long int) (highResolutionTime/1000000LLU); + tv->tv_usec = (highResolutionTime%1000000LLU); +}