获取时间戳的不同方式总结
本文以获取毫秒级时间戳(13位数)为例:
1.windows系统下获取时间戳
方法1. 调用GetLocalTime
typedef struct _SYSTEMTIME
{
WORD wYear;//年
WORD wMonth;//月
WORD wDayOfWeek;//星期,0为星期日,1为星期一,2为星期二……
WORD wDay;//日
WORD wHour;//时
WORD wMinute;//分
WORD wSecond;//秒
WORD wMilliseconds;//毫秒
}SYSTEMTIME,*PSYSTEMTIME;
//函数原型
VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime //address of system times structure
);
代码示例:
#include <windows.h>
#include <time.h>
int64_t timeStampMs()
{
struct timeval tv;
SYSTEMTIME sys;
GetLocalTime(&sys);
struct tm _tm;
_tm.tm_year = sys.wYear - 1900;
_tm.tm_mon = sys.wMonth - 1;
_tm.tm_mday = sys.wDay;
_tm.tm_hour = sys.wHour;
_tm.tm_min = sys.wMinute;
_tm.tm_sec = sys.wSecond;
_tm.tm_isdst = -1;
tv.tv_sec = (time_t)mktime(&_tm);
tv.tv_usec = sys.wMilliseconds * 1000;
return ((int64_t)tv.tv_sec * 1000 + (int64_t)tv.tv_usec / 1000);
}
方法2. 调用GetSystemTimeAsFileTime
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
//函数原型
VOID WINAPI GetSystemTimeAsFileTime(
_Out_ LPFILETIME lpSystemTimeAsFileTime
);
代码示例:
int64_t timeStampMs()
{
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
ULARGE_INTEGER uli;
uli.LowPart = ft.dwLowDateTime;
uli.HighPart = ft.dwHighDateTime;
return (uli.QuadPart / 10000 - 11644473600000);
2.linux系统下调用gettimeofday获取时间戳
struct timeval{
long int tv_sec; // 秒数
long int tv_usec; // 微秒数
}
struct timezone{
int tz_minuteswest;/*格林威治时间往西方的时差*/
int tz_dsttime;/*DST 时间的修正方式*/
}
//函数原型
int gettimeofday(struct timeval*tv, struct timezone *tz);
代码示例:
#include <sys/time.h>
int64_t timeStampMs()
{
struct timeval tv;
gettimeofday(&tv, nullptr);
return ((int64_t)tv.tv_sec * 1000 + (int64_t)tv.tv_usec / 1000);
}
3.c++11获取时间戳
代码示例:
#include <chrono>
int64_t timeStampMs()
{
auto now = std::chrono::system_clock::now();
auto tp = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
int64_t timeStamp = tp.time_since_epoch().count();
return timeStamp;
}
4.c语言标准库获取时间戳(只能到秒精度)
#include <stdio.h>
#include <ctime>
int64_t timeStampSec()
{
time_t now;
time(&now);
return (int64_t)now;
}
5.Qt获取时间戳
代码示例:
#include <QDateTime>
int64_t timeStampMs()
{
return QDateTime::currentDateTime().toMSecsSinceEpoch();
}
---- 结语 ----
以上实例是获取毫秒时间戳(13位),当然稍作修改要获取秒时间戳(10位)也不在话下。那如果要得到精度更高的(19位)纳秒级呢? 这里以c++为例,修改代码为:
auto now = std::chrono::system_clock::now();
auto tp = std::chrono::time_point_cast<std::chrono::nanoseconds>(now);
int64_t timeStamp = tp.time_since_epoch().count();
printf("ns timestamp: %lld \n", timeStamp);
作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正