C++ 日期和时间
日期和时间
<ctime>库允许我们处理日期和时间。
要使用它,您必须导入<ctime>头文件:
示例
#include <ctime> // Import the ctime library
显示当前日期和时间
<ctime>库提供了多种用于测量日期和时间的函数。
time()函数返回一个表示当前日期和时间的时间戳。我们可以使用ctime()函数来显示时间戳所代表的日期和时间:
示例
显示当前日期:
// 获取当前日期和时间的时间戳
time_t timestamp;
time(×tamp);
// 显示时间戳所表示的日期和时间
cout << ctime(×tamp);
亲自试一试 »
time() 函数的两种用法
time() 函数会将时间戳写入参数指定的内存地址,同时也会返回该时间戳的值。
使用 time() 函数的另一种方法是传入一个空指针,并直接使用其返回值。
time_t timestamp = time(NULL);
数据类型
有两种不同的数据类型用于存储日期和时间:time_t 用于时间戳,struct tm 用于日期时间结构。
时间戳 用一个数字表示一个时间点,这使得计算机更容易进行计算。
日期时间结构 是一种将日期和时间的不同组成部分表示为成员的结构。这使得我们更容易指定日期。日期时间结构包含以下成员:
tm_sec- 一分钟内的秒数tm_min- 一小时内的分钟数tm_hour- 一天内的小时数(0 到 23)tm_mday- 月份中的日期tm_mon- 月份(0 到 11,从一月开始)tm_year- 自 1900 年以来的年数tm_wday- 星期几(0 到 6,从星期日开始)tm_yday- 一年中的第几天(从 0 到 365,0 代表 1 月 1 日)tm_isdst- 夏令时生效时为正,非夏令时生效时为零,未知时为负
请始终牢记日期组成部分的表示方式:
- 小时采用 24 小时制。例如,晚上 11 点表示为 23。
- 月份从 0 到 11。例如,12 月表示为 11,而不是 12。
- 年份以 1900 年为基准。例如,2024 年表示为 124,因为自 1900 年以来已经过去了 124 年。
创建时间戳
time() 函数只能创建当前日期的时间戳,但我们可以使用 mktime() 函数创建任意日期的时间戳。
mktime() 函数将日期时间结构转换为时间戳。
示例
使用 mktime() 函数创建时间戳:
struct tm datetime;
time_t timestamp;
datetime.tm_year = 2023 - 1900; // 自1900年以来的年数
datetime.tm_mon = 12 - 1; // 自一月以来的月份数
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// 必须指定夏令时
// -1 使用计算机的时区设置
datetime.tm_isdst = -1;
timestamp = mktime(&datetime);
cout << ctime(×tamp);
亲自试一试 »
注意:mktime() 函数需要以下成员具有值:tm_year、tm_mon、tm_mday、tm_hour、tm_min、tm_sec 和 tm_isdst。
创建日期时间结构
mktime() 函数还会使用正确的值填充日期时间结构的 tm_wday 和 tm_yday 成员,从而完善结构并生成有效的日期时间。例如,它可以用于查找给定日期的星期几:
示例
查找指定日期的星期几:
// 创建日期时间结构,并使用 mktime 函数填充缺失的成员。
struct tm datetime;
datetime.tm_year = 2023 - 1900; // Number of years since 1900
datetime.tm_mon = 12 - 1; // Number of months since January
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
cout << "The date is on a " << weekdays[datetime.tm_wday];
亲自试一试 »
localtime() 和 gmtime() 函数可以将时间戳转换为 datetime 结构。
localtime() 函数返回一个指向表示计算机所在时区时间的结构的指针。
gmtime() 函数返回一个指向表示 GMT 时区时间的结构的指针。
这些函数返回一个指向 datetime 结构的指针。如果我们想确保它的值不会意外更改,应该通过解引用指针来复制它。要了解有关解引用的更多信息,请参阅C++ 解引用教程。
示例
获取日期时间数据并输出当前小时数:
time_t timestamp = time(×tamp);
struct tm datetime = *localtime(×tamp);
cout << datetime.tm_hour;
亲自试一试 »
显示日期
到目前为止,我们一直使用 ctime() 函数来显示时间戳中包含的日期。要显示日期时间结构中的日期,我们可以使用 asctime() 函数。
示例
显示以日期时间结构表示的日期:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << asctime(&datetime);
亲自试一试 »
注意: asctime() 函数不会更正无效日期。例如,如果您将日期设置为 32,它将显示 32。mktime() 函数可以更正此类错误:
示例
请先更正日期再显示:
// 创建日期时间结构并使用 mktime 更正错误
struct tm datetime;
datetime.tm_year = 2022 - 1900; // Number of years since 1900
datetime.tm_mon = 0; // 0 is January
datetime.tm_mday = 32;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
cout << asctime(&datetime);
亲自试一试 »
ctime() 和 asctime() 函数可以显示日期,但不能选择日期的显示方式。
要选择日期的显示方式,我们可以使用 strftime() 函数。
示例
用不同的方式表示当前日期:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
char output[50];
strftime(output, 50, "%B %e, %Y", &datetime);
cout << output << "
";
strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "
";
strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "
";
strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "
";
亲自试一试 »
strftime() 函数将日期格式化并以 C 风格字符串的形式写入 char 数组。它有四个参数:
- 第一个参数指向用于存储格式化日期的字符数组。
- 第二个参数指定数组中的可用空间。
- 第三个参数允许我们使用格式说明符来选择日期的格式。
- 最后一个参数是指向包含要显示的日期的日期时间结构的指针。
下表列出了一些常用的格式说明符。如需更完整的列表,请参阅strftime() 参考页面。
| 格式说明符 | 描述 | 示例 |
|---|---|---|
%a |
星期几的简短表示 | Fri |
%b |
月份名称的缩写 | Dec |
%B |
月份名称的完整表示 | December |
%d |
日期(带前导零) | 09 |
%e |
日期(带前导空格) | 9 |
%H |
24 小时制小时 | 14 |
%I |
12 小时制小时 | 02 |
%M |
一小时内的分钟数 | 30 |
%p |
AM 或 PM | PM |
%S |
秒数(以分钟为单位) | 01 |
%y |
两位数年份表示法 | 23 |
%Y |
四位数年份表示法 | 2023 |
测量时间
有两种不同的函数可以用来测量时间差。
difftime() 函数用于测量两个不同时间戳之间经过的秒数。这在测量日期之间的时间差时非常有用。
示例
测量两个时间戳之间的时间差
time_t now;
time_t nextyear;
struct tm datetime;
now = time(NULL);
datetime = *localtime(&now);
datetime.tm_year = datetime.tm_year + 1;
datetime.tm_mon = 0;
datetime.tm_mday = 1;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
nextyear = mktime(&datetime);
int diff = difftime(nextyear, now);
cout << diff << " seconds until next year";
亲自试一试 »
clock() 函数用于在程序运行时测量较短的时间间隔。它比 difftime() 函数更精确。
每次调用 clock 函数都会返回一个特殊的时间戳,该时间戳以时钟为单位(时钟是时间单位,取决于库的实现方式),其数据类型为 clock_t。要测量时间差,请在两个不同的时间点存储时间戳,然后将它们相减。时间差以时钟为单位,但您可以通过将其除以 CLOCKS_PER_SEC 常量将其转换为秒。
示例
测量程序运行所需时间:
clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
k += i;
}
clock_t duration = clock() - before;
cout << "Duration: " << (float)duration / CLOCKS_PER_SEC << " seconds";
亲自试一试 »
注意: 进行除法运算前,请务必将值强制转换为 float 或 double 类型,否则可能会导致整数除法,从而造成小数部分被截断。
完整<ctime>参考
有关 ctime 函数的完整参考,请访问我们的 C++ ctime 参考。

