C++ 日期和时间
日期和时间
<ctime>
库允许我们处理日期和时间。
要使用它,您必须导入 <ctime>
头文件
示例
#include <ctime> // Import the ctime library
显示当前日期和时间
<ctime>
库有各种函数来测量日期和时间。
time()
函数会给我们一个表示当前日期和时间的时间戳。我们可以使用 ctime()
函数来显示时间戳所代表的日期和时间
示例
显示当前日期
// Get the timestamp for the current date and time
time_t timestamp;
time(×tamp);
// Display the date and time represented by the timestamp
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,从 1 月开始)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; // Number of years since 1900
datetime.tm_mon = 12 - 1; // Number of months since January
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Daylight Savings must be specified
// -1 uses the computer's timezone setting
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
成员,从而完成结构并提供有效的日期时间。例如,它可用于查找给定日期的星期几
示例
查找指定日期的星期几
// Create the datetime structure and use mktime to fill in the missing members
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()
函数可以将时间戳转换为日期时间结构。
localtime()
函数返回一个指向表示计算机时区的结构的指针。
gmtime()
函数返回一个指向表示 GMT 时区的结构的指针。
这些函数返回一个指向日期时间结构的指针。如果我们想要确保其值不会意外更改,我们应该通过取消引用指针来制作副本。要了解有关取消引用的信息,请参阅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()
函数可以更正这些错误
示例
在显示日期之前更正日期
// Create the datetime structure and use mktime to correct mistakes
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 << "\n";
strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "\n";
strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "\n";
strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "\n";
试试看 »
strftime()
函数格式化日期并将其作为 C 样式字符串写入 char
数组。它有四个参数
- 第一个参数指向将写入格式化日期的 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.is_dst = -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 参考。