【C++】C++获取当前系统时间
程序员赵大宝 2024-08-17 10:05:12 阅读 67
目录
一.ctime
二.localtime
三.strftime
一.ctime
在C++中, ctime 是C标准库中的一个头文件,它提供了一组函数来处理日期和时间。虽然C++11引入了更现代的 <chrono> 库,但 ctime 仍然被广泛使用,特别是在与C代码兼容或需要简单日期和时间操作时。
以下是一些 ctime 头文件中定义的常用函数:
1. time_t time(time_t* ptr) : 获取当前时间的时间戳(自1970年1月1日以来的秒数)。如果提供了 ptr 参数,函数会将当前时间戳存储在 ptr 指向的位置。
int main() {
time_t t = time(NULL);
std::cout << "Current time: " << t << std::endl;
return 0;
}
2. double difftime(time_t time1, time_t time2) : 计算两个时间戳之间的差异,返回一个 double 类型的值,表示时间1比时间2多出的秒数。
3. tm* localtime(const time_t* time) : 将时间戳转换为 tm 结构,该结构包含了日期和时间的各个组成部分。
#include <ctime>
int main() {
time_t t = time(NULL);
tm* localTime = localtime(&t);
std::cout << "Local time: "
<< (localTime->tm_year + 1900) << "-"
<< (localTime->tm_mon + 1) << "-"
<< localTime->tm_mday << " "
<< localTime->tm_hour << ":"
<< localTime->tm_min << ":"
<< localTime->tm_sec << std::endl;
return 0;
}
4. tm* gmtime(const time_t* time) : 类似于 localtime ,但返回的是协调世界时(UTC)。
5. size_t strftime(char* s, size_t max, const char* format, const tm* timeptr) : 根据给定的格式将 tm 结构转换为字符串。
#include <ctime>
int main() {
time_t t = time(NULL);
tm* localTime = localtime(&t);
char buffer[100];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localTime);
std::cout << "Formatted time: " << buffer << std::endl;
return 0;
}
6. void tzset(void) : 设置时区环境变量,影响 localtime 和 strftime 函数的输出。
请注意, ctime 库中的函数通常依赖于操作系统的实现,并且 tm 结构的字段可能在不同的系统上有所不同。此外,由于 tm 结构中的 tm_year 字段是从1900年开始计数的,所以在打印年份时需要加上1900。
对于现代C++开发,推荐使用 <chrono> 库,因为它提供了类型安全和更丰富的功能。然而,如果你需要与C代码兼容或者处理一些简单的日期和时间问题, ctime 仍然是一个有用的选择。
二.localtime
在C++中, localtime 是一个标准库函数,用于将自UTC时间1970年1月1日午夜(即UNIX纪元时间0点)以来的秒数转换为本地时间的 tm 结构表示。这个函数定义在 <ctime> 头文件中。
函数的原型如下:
tm* localtime(const time_t *timer);
参数说明:
timer :指向 time_t 类型的指针, time_t 通常是一个长整型,表示从UNIX纪元时间以来的秒数。
localtime 函数会将传入的秒数转换为本地时间,并返回一个 tm 结构的指针。这个结构体包含了分解的时间信息,例如年、月、日、小时、分钟和秒等。
tm 结构通常定义如下:
struct tm {
int tm_sec; // 秒,0-59
int tm_min; // 分钟,0-59
int tm_hour; // 小时,0-23
int tm_mday; // 一个月中的第几天,1-31
int tm_mon; // 月份,0-11
int tm_year; // 自1900年以来的年数
int tm_wday; // 一周中的第几天,0-6,0是星期天
int tm_yday; // 一年中的第几天,0-365
int tm_isdst; // 夏令时标志,非0表示夏令时
};
这里有一个使用 localtime 的简单例子:
#include <iostream>
#include <ctime>
int main() {
time_t t = time(NULL); // 获取当前时间的秒数
tm* timePtr = localtime(&t); // 转换为本地时间的tm结构
if (timePtr != NULL) {
std::cout << "Current local time: "
<< (timePtr->tm_year + 1900) << "-" // tm_year是从1900年开始计数的
<< (timePtr->tm_mon + 1) << "-" // tm_mon是从0开始计数的,所以要加1
<< timePtr->tm_mday << " "
<< timePtr->tm_hour << ":"
<< timePtr->tm_min << ":"
<< timePtr->tm_sec << std::endl;
}
return 0;
}
这段代码将获取当前的本地时间,并将其分解为年、月、日、小时、分钟和秒,然后打印出来。注意, tm_year 字段是从1900年开始计数的,而 tm_mon 字段是从0开始计数的,所以在打印时需要做相应的调整。
三.strftime
strftime 是一个C语言标准库函数,用于根据给定的格式将时间转换为字符串。在C++中, strftime 函数同样可用,并且是 <ctime> 头文件中定义的。
函数的原型如下:
size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
参数说明:
strDest :指向用于存放格式化时间字符串的缓冲区的指针。
maxsize :缓冲区的大小,包括空字符。
format :格式字符串,定义了时间字符串的格式。
timeptr :指向 tm 结构的指针, tm 结构包含了分解的时间信息。
strftime 函数会根据 format 指定的格式,将 timeptr 指向的时间信息格式化为字符串,并存储到 strDest 指向的缓冲区中。如果格式化后的字符串长度超过 maxsize ,函数将停止写入并返回0。
一些常用的格式说明符包括:
%Y :四位数年份表示(例如:2024)
%m :月份(01到12)
%d :月份中的日(01到31)
%H :小时(00到23)
%M :分钟(00到59)
%S :秒(00到59)
这里有一个简单的例子:
#include <iostream>
#include <ctime>
#include <cstring>
int main() {
time_t t = time(NULL);
tm* timePtr = localtime(&t);
char buffer[100];
strftime(buffer, 100, "%Y-%m-%d %H:%M:%S", timePtr);
std::cout << "Current date and time: " << buffer << std::endl;
return 0;
}
这段代码将获取当前的日期和时间,并使用 strftime 函数将其格式化为 "YYYY-MM-DD HH:MM:SS" 的形式。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。