C++中并没有针对时间特意提供特定的时间类型,而是直接继承了C语言的结构以及函数,因此在C++中使用时间函数需要引用<ctime>头文件(或者<time.h>)这篇文章主要介绍了C++时间函数。
格林威治时间GMT(Greenwich Mean Time)
格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天文观测,选择了穿过英国伦敦格林威治天文台子午仪中心的一条经线作为零度参考线,这条线,简称格林威治子午线。
1884年10月召开了一个国际子午线会议,该会议将格林威治子午线设定为本初子午线,并将格林威治平时 (GMT, Greenwich Mean Time) 作为世界时间标准(UT, Universal Time)。由此也确定了全球24小时自然时区的划分,所有时区都以和 GMT 之间的偏移量做为参考。
1972年之前,格林威治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。
XP系统中,默认时间格式是GMT。
目前UTC与GMT 相差为0.9秒,故二者可以基本视为一致。
在日常生活中所使用的时间我们通常称之为本地时间。
这个时间等于我们所在(或者所使用)时区内的当地时间,它由与世界标准时间(UTC)之间的偏移量来定义。这个偏移量可以表示为 UTC- 或 UTC+,后面接上偏移的小时和分钟数。
GMT是前世界标准时,UTC是现世界标准时。
UTC 比 GMT更精准,以原子时计时,适应现代社会的精确计时。
但在不需要精确到秒的情况下,二者可以视为等同。
每年格林尼治天文台会发调时信息,基于UTC。
1:时间存储方式
1:struct tm : 是一个结构体,用来存储年月日时分秒
struct tm
{
int tm_sec; /*秒,正常范围0-59, 但允许至61*/
int tm_min; /*分钟,0-59*/
int tm_hour; /*小时, 0-23*/
int tm_mday; /*日,即一个月中的第几天,1-31*/
int tm_mon; /*月, 从一月算起,0-11*/ 1+p->tm_mon;
int tm_year; /*年, 从1900至今已经多少年*/ 1900+ p->tm_year;
int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
int tm_isdst; /*日光节约时间的旗标*/
};
特别注意,年份是从1900年起至今多少年,而不是直接存储如2022年。月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。2: time_t : 一个整型。用来存储从 1970-1-1 00:00:00年到现在UTC+0经过了多少秒。
3:time() :总是返回房钱格林威治时间,不论系统/程序采用的哪个时区,所以使用time_t的时候,需要用 time(time_t*) 来获取时间
4:localtime: 返回经过时区转换的时间,并用 struct tm接收。
2:localtime()
#include<iostream>
#include<ctime>
#include<chrono>
using namespace std;
void getLocalTime(){
// 1: 这是一个结构体:存储年月日时分秒
struct tm *timeStamp = nullptr;
// 2: 定义:格林威治的时间+时区偏差,生成 tm结构
time_t tmSec;
// 3:取得从1970年1月1日至今的秒数
cout<< time(&tmSec)<< endl;
// 4: 返回经过时区转换的时间
timeStamp = localtime(&tmSec);
cout<< "年份:"<< 1900+timeStamp->tm_year <<endl;
cout<< "月份:"<< 1+timeStamp->tm_mon <<endl;
cout<< "日:"<< 1+timeStamp->tm_mday <<endl;
cout<< "分钟:"<< timeStamp->tm_min <<endl;
cout<< "小时:"<< timeStamp->tm_hour <<endl;
cout<< "秒:"<< timeStamp->tm_sec <<endl;
cout<< "星期:"<< timeStamp->tm_wday <<endl;
cout<< asctime(timeStamp) <<endl;
}
int main(){
getLocalTime();
}
3: gmtime
void getGmTime(){
cout<< "========"<<endl;
// 1: 这是一个结构体:存储年月日时分秒
struct tm *timeStamp = nullptr;
// 2: 定义:格林威治的时间+时区偏差,生成 tm结构
time_t tmSec = time(nullptr);
// 3:取得从1970年1月1日至今的秒数
cout<< time(&tmSec)<< endl;
// 4: 返回经过时区转换的时间
timeStamp = gmtime(&tmSec);
cout<< "年份:"<< 1900+timeStamp->tm_year <<endl;
cout<< "月份:"<< 1+timeStamp->tm_mon <<endl;
cout<< "日:"<< 1+timeStamp->tm_mday <<endl;
cout<< "分钟:"<< timeStamp->tm_min <<endl;
cout<< "小时:"<< timeStamp->tm_hour <<endl;
cout<< "秒:"<< timeStamp->tm_sec <<endl;
cout<< "星期:"<< timeStamp->tm_wday <<endl;
cout<< asctime(timeStamp) <<endl;
}
int main(){
getGmTime();
}
4: formattime
void getFormatTime(){
cout<< "----------"<< endl;
// 时间格式化
const char* format = "%Y-%m-%d %H:%M:%S";
// 返回格式化的时间字符串放入在字符数组中
char strTime[128];
struct tm *timeStamp = nullptr;
time_t tmSec;
time(&tmSec);
timeStamp = localtime(&tmSec);
strftime(strTime, sizeof(strTime), format, timeStamp);
// strTime 是一个 char的地址 即 char* ,所以打印的是这个字符串
printf(strTime);
}
int main(){
getFormatTime();
}
5: chrono计算花费的时间
void calulate_time(){
cout<< "========"<< endl;
auto start = chrono::system_clock::now();
// do something
auto end = chrono::system_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(end-start);
cout<< "花费的时间:"
<< double(duration.count())*chrono::microseconds::period::num/chrono::microseconds::period::den
<< "秒"<< endl;
}
int main(){
calulate_time();
}