VC时间函数学习记录(获取基于1970-1-1的标准时间)

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小时)的时间计数。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值