void GetSystemTime(LPSYSTEMTIME lpSystemTime)
该函数返回当前系统时间。
SYSTEMTIME结构为
typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
BOOL SystemTimeToFileTime(
const SYSTEMTIME* lpSystemTime,
LPFILETIME lpFileTime
)
该函数转换系统时间到64位的基于1601年1月1日的标准时间,这个时间是以100ns作为单位
参数FILETIME结构
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
NTSTATUS NtQuerySystemTime(
PLARGE_INTEGER SystemTime
);
该函数返回系统时间,该系统时间是64位的基于1601年1月1日的标准时间,这个时间是以100ns作为单位
注意:这个函数仅仅适用于Windows 2000 and Windows XP系统,这个函数等同于GetSystemTimeAsFileTime
参数LARGE_INTEGER结构
typedef struct union {
struct {
DWORD LowPart;
DWORD HighPart;
};
ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
得到基于1970-1-1的标准时间的函数
/*获取UTC标准时间*/
unsigned long GetUtcTime()
{
SYSTEMTIME stSysTime;
FILETIME stFileTime;
ULARGE_INTEGER ullSystime, ullUtcTime;
ULONGLONG u64Value;
unsigned long u32Second;
/*获取当前时间*/
GetSystemTime(&stSysTime);
/*将系统时间转换为以100ns间隔从1601年1月1日的整数值,UTC时间*/
SystemTimeToFileTime(&stSysTime, &stFileTime);
/*拷贝UTC时间到large inter*/
memcpy(&ullSystime, &stFileTime, sizeof(stFileTime));
/*设置标准1970年1月1日的系统时间*/
stSysTime.wYear = 1970;
stSysTime.wMonth = 1;
stSysTime.wDay = 1;
stSysTime.wHour = 0;
stSysTime.wMinute = 0;
stSysTime.wSecond = 0;
stSysTime.wMilliseconds = 0;
/*将系统时间转换为以100ns间隔从1601年1月1日的整数值,UTC时间*/
SystemTimeToFileTime(&stSysTime, &stFileTime);
/*拷贝UTC时间到large inter*/
memcpy((void*)&ullUtcTime, (void*)&stFileTime, sizeof(stFileTime));
/*获取标准时间差,大小以100ns作为单位*/
u64Value = ullSystime.QuadPart - ullUtcTime.QuadPart;
/*转换为秒*/
u32Second = (unsigned long)u64Value / 10000000;
return u32Second;
}
关于时区的注意:
在计算SOC的时候,如果自己手动计算,对于SOC为0(基于1970-1-1 00:00:00)时,对应不通的时区时间点是各自的时区差。
也就是说在soc为0时,在北京时间为8点。这样根据当前北京时间计算SOC时,根据当前时间点计算SOC,在计算出SOC的具体数值之后,
需要减去28800(8小时)的时间计数。