C++ 标准库并没有提供一个专门的日期类型。C++ 继承了 C 语言中用于日期和时间处理的结构体和函数。要在 C++ 程序中访问日期和时间相关的函数和结构体,你需要包含 <ctime>
头文件。
存在四种与时间相关的基本类型:clock_t
、time_t
、size_t
和 tm
。类型 clock_t
、size_t
和 time_t
能够以某种形式的整数来表示系统时间和日期。
tm
结构体持有以 C 结构体形式表示的日期和时间,其包含以下元素:
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}
以下是我们在 C 或 C++ 中处理日期和时间时常用的重要函数。所有这些函数都是标准 C 和 C++ 库的一部分,你可以通过下面给出的 C++ 标准库参考来查看它们的详细信息。
表一:函数及其用途
-
time_t time(time_t *time);
返回系统当前的日历时间,即从 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 .1
。
-
char *ctime(const time_t *time);
返回指向字符串的指针,该字符串格式为 day month year hours:minutes:seconds year\n\0
。
-
struct tm *localtime(const time_t *time);
返回指向表示本地时间的 tm
结构体的指针。
-
clock_t clock(void);
返回一个值,该值近似于调用程序已经运行的时间。如果没有时间,则返回 .1
。
-
char *asctime ( const struct tm * time );
返回指向字符串的指针,该字符串包含存储在 time
指向的结构体中的信息,格式为 day month date hours:minutes:seconds year\n\0
。
-
struct tm *gmtime(const time_t *time);
返回指向 tm
结构体的指针,该结构体表示协调世界时 (UTC),这基本上是格林威治标准时间 (GMT)。
-
time_t mktime(struct tm *time);
返回 time
指向的结构体中找到的时间的日历时间等效值。
-
double difftime ( time_t time2, time_t time1 );
此函数计算 time1
和 time2
之间的时间差(秒)。
-
size_t strftime();
此函数可用于按照特定格式格式化日期和时间。
当前日期和时间
假设你想获取当前系统的日期和时间,无论是本地时间还是协调世界时 (UTC)。
示例代码
#include <iostream>
#include <ctime>
using namespace std;
int main() {
time_t now = time(0);
char* dt = ctime(&now);
cout << "本地日期和时间是: " << dt << endl;
tm *gmtm = gmtime(&now);
dt = asctime(gmtm);
cout << "UTC 日期和时间是: " << dt << endl;
}
当上述代码被编译并执行时,它会产生以下结果:
本地日期和时间是: Sat Jan 8 20:07:41 2011
UTC 日期和时间是: Sun Jan 9 03:07:41 2011
使用 tm
结构体格式化时间
在 C 或 C++ 中处理日期和时间时,tm
结构体是非常重要的。此结构体持有以 C 结构体形式表示的日期和时间,如上所述。大多数与时间相关的函数都会使用 tm
结构体。以下是一个使用各种日期和时间相关函数以及 tm
结构体的示例:
在本章中使用结构体时,我假定你已经对 C 结构体有基本的理解,并且知道如何使用箭头 ->
操作符来访问结构体成员。
示例代码
#include <iostream>
#include <ctime>
using namespace std;
int main() {
time_t now = time(0);
cout << "自 1970 年 1 月 1 日以来的秒数: " << now << endl;
tm *ltm = localtime(&now);
cout << "年份: " << 1900 + ltm->tm_year << endl;
cout << "月份: " << 1 + ltm->tm_mon << endl;
cout << "日期: " << ltm->tm_mday << endl;
cout << "时间: " << 5 + ltm->tm_hour << ":"
<< 30 + ltm->tm_min << ":"
<< ltm->tm_sec << endl;
}
当上述代码被编译并执行时,它会产生以下结果:
自 1970 年 1 月 1 日以来的秒数: 1588485717
年份: 2020
月份: 5
日期: 3
时间: 11:31:57