C++获取当前时间 (std::chrono)

  在C++11之前要获取当前时间,大多数情况下要使用C语言的time库:

#include <iostream>
#include<time.h> 
#include <sstream>

int main()
{
	time_t now = time(NULL);
	tm* tm_t = localtime(&now);
	std::stringstream ss;
	ss << "year:" << tm_t->tm_year + 1900 << " month:" << tm_t->tm_mon + 1 << " day:" << tm_t->tm_mday
		<< " hour:" << tm_t->tm_hour << " minute:" << tm_t->tm_min << " second:" << tm_t->tm_sec;

    std::cout << ss.str();
	
	int wait;
	std::cin >> wait;
}

time_t是一个64位的整型。记录的是从1970-01-01 00:00:00到现在经过的时间,精度只能到秒。从tm的结构也能看出来:

struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second
    int tm_min;   // minutes after the hour - [0, 59]
    int tm_hour;  // hours since midnight - [0, 23]
    int tm_mday;  // day of the month - [1, 31]
    int tm_mon;   // months since January - [0, 11]
    int tm_year;  // years since 1900
    int tm_wday;  // days since Sunday - [0, 6]
    int tm_yday;  // days since January 1 - [0, 365]
    int tm_isdst; // daylight savings time flag
};

要输出真实的日期,需要tm_year+1900, tm_mon+1

当然也可以直接调用系统API,GetSystemTime,GetLocalTime,精度都到毫秒。注意GetSystemTime获取的是UTC时间,跟GetLocalTime获取的北京时间不同,有8小时时差,需要hour+8才是真实的小时:

	SYSTEMTIME sysTime = { 0 };
	GetSystemTime(&sysTime);
	ss << "year:" << sysTime.wYear << " month:" << sysTime.wMonth << " day:" << sysTime.wDay
		<< " hour:" << sysTime.wHour+8 << " minute:" << sysTime.wMinute << " second:" << sysTime.wSecond <<" milliseconds:"<< sysTime.wMilliseconds;
	std::cout << ss.str() << std::endl;

说说C++11中的时间,可以精确到纳秒:

	std::cout << "秒:"<<std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count() << std::endl;
	std::cout << "毫秒:" << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()<<std::endl;
	std::cout << "微秒:" << std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count() << std::endl;
	std::cout << "纳秒:" << std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count() << std::endl;

std::chrono::system_clock::now() 是当前的时间点

std::chrono::system_clock::now().time_since_epoch()获取到的也是到时间元年(1970-01-01)的时间间隔,可以用std::chrono::duration_cast<>函数可以方便的改变获取到时间的精度。

std::chrono::duration_cast<std::chrono::seconds>转换的时间与C库中的time函数获取的相同:

C time: 1582891867
秒:1582891867
毫秒:1582891867251
微秒:1582891867251721
纳秒:1582891867252208200

std::chrono::system_clock::now()获取的是时间点std::chrono::time_point,时间点的time_since_epoch成员可以获取当前时间点到时间元年经过的时间。

time_t tNow= std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());也可以转换为C库的时间time_t但是精度就变为秒,相当于std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count()

不足之处是没有好的时间格式化方法,不能方便的输出,所以一般是先转为time_t,C的方式来输出,不足之处是只能输出到秒了,不过也是有补足的方法:

	auto now = std::chrono::system_clock::now();
	//通过不同精度获取相差的毫秒数
	uint64_t dis_millseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count()
		- std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count() * 1000;
	time_t tt = std::chrono::system_clock::to_time_t(now);
	auto time_tm = localtime(&tt);
	char strTime[25] = { 0 };
	sprintf(strTime, "%d-%02d-%02d %02d:%02d:%02d %03d", time_tm->tm_year + 1900,
		time_tm->tm_mon + 1, time_tm->tm_mday, time_tm->tm_hour,
		time_tm->tm_min, time_tm->tm_sec, (int)dis_millseconds);
	std::cout << strTime << std::endl;

输出时间: 

2020-02-28 20:24:08 285

STL正在不断完善,期待更完善的时间库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值