Linux和Windows平台下获取时间戳方式总结【超全面:系统接口、c、c++、Qt】


本文以获取毫秒级时间戳(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
转载请注明出处,如有不当欢迎指正

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值