CMPlatform/src/Win/Time.cpp

91 lines
2.2 KiB
C++
Raw Normal View History

2019-08-23 10:54:57 +08:00
#include<hgl/platform/Platform.h>
#include<hgl/TypeFunc.h>
namespace hgl
{
namespace
{
#define APR_DELTA_EPOCH_IN_USEC 11644473600000000 //转Windows时间到Unix时间的一个差值
//Windows是1601.1.1
//Unix是1970.1.1
//tanks for APR
static inline void FileTimeToMicroTime(uint64 *result, FILETIME *input)
{
/* Convert FILETIME one 64 bit number so we can work with it. */
*result = input->dwHighDateTime;
*result = (*result) << 32;
*result |= input->dwLowDateTime;
*result /= 10; /* Convert from 100 nano-sec periods to micro-seconds. */
*result -= APR_DELTA_EPOCH_IN_USEC; /* Convert from Windows epoch to Unix epoch */
return;
}
}//namespace
long GetGMTOff()
{
SYSTEMTIME st;
FILETIME ft;
uint64 local_time;
uint64 utc_time;
GetLocalTime(&st);
SystemTimeToFileTime(&st, &ft);
FileTimeToMicroTime(&local_time, &ft);
GetSystemTime(&st);
SystemTimeToFileTime(&st, &ft);
FileTimeToMicroTime(&utc_time, &ft);
return(utc_time - local_time);
}
/**
*
* @return ()
*/
uint64 GetMicroTime()
{
SYSTEMTIME st;
FILETIME ft;
uint64 result;
GetLocalTime(&st);
SystemTimeToFileTime(&st, &ft);
FileTimeToMicroTime(&result, &ft);
return(result);
}
/**
*
* @return ()
*/
uint64 GetTime()
{
return(GetMicroTime() / 1000);
}
/**
* ()
* @return ()
*/
double GetDoubleTime() ///<取得当前时间(双精度,单位秒)
{
return(double(GetMicroTime()) / HGL_MICRO_SEC_PER_SEC);
}
/**
*
* @param time ()
*/
void WaitTime(double t)
{
if(t<=0)return;
::Sleep(DWORD(t*HGL_MILLI_SEC_PRE_SEC));
}
}//namespace hgl