在 C++ 中,时间形式转换是一个常见的需求,主要涉及到将时间在不同的表示形式之间进行转换,例如将时间从字符串形式转换为tm
结构或time_t
类型,或者反之。以下是详细介绍:
1. 基本时间类型
time_t
类型
time_t
是 C/C++ 标准库中用于表示时间的一种基本数据类型,它实际上是一个整数类型(通常是长整型),用于记录从 1970 年 1 月 1 日 00:00:00 UTC 到某个特定时间点所经过的秒数。这个时间点被称为 Unix 时间戳的起始点。例如,time_t
可以通过time
函数来获取当前时间的时间戳:
#include <iostream> #include <ctime> int main() { time_t current_time = time(nullptr); std::cout << "Current time as time_t: " << current_time << std::endl; return 0; }
tm
结构
tm
结构在<ctime>
头文件中定义,用于存储分解后的时间信息。它包含了年、月、日、时、分、秒等多个成员,具体如下:
struct tm { int tm_sec; // 秒,范围从0到60(考虑闰秒) int tm_min; // 分,范围从0到59 int tm_hour; // 时,范围从0到23 int tm_mday; // 日,范围从1到31 int tm_mon; // 月,范围从0到11(0表示一月) int tm_year; // 年,从1900开始计数 int tm_wday; // 星期几,范围从0到6(0表示星期日) int tm_yday; // 一年中的第几天,范围从0到365 int tm_isdst; // 夏令时标志 };
- 可以通过
localtime
或gmtime
函数将time_t
类型的时间转换为tm
结构,前者返回本地时间,后者返回格林威治标准时间(GMT)。例如:
#include <iostream> #include <ctime> int main() { time_t current_time = time(nullptr); struct tm* local_time = localtime(¤t_time); std::cout << "Year: " << local_time->tm_year + 1900 << std::endl; std::cout << "Month: " << local_time->tm_mon + 1 << std::endl; std::cout << "Day: " << local_time->tm_mday << std::endl; std::cout << "Hour: " << local_time->tm_hour << std::endl; std::cout << "Minute: " << local_time->tm_min << std::endl; std::cout << "Second: " << local_time->tm_sec << std::endl; return 0; }
2. 时间形式转换函数
strftime
函数:将tm
结构转换为字符串形式
strftime
函数用于将tm
结构表示的时间格式化为指定格式的字符串。其基本语法如下:
size_t strftime(char* s, size_t maxsize, const char* format, const struct tm* timeptr);
- 其中,
s
是存储格式化后字符串的字符数组,maxsize
是字符数组的最大长度,format
是格式化字符串,timeptr
是tm
结构的指针。 - 例如,将当前时间转换为指定格式的字符串:
#include <iostream> #include <ctime> int main() { time_t current_time = time(nullptr); struct tm* local_time = localtime(¤t_time); char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time); std::cout << "Formatted time string: " << buffer << std::endl; return 0; }
- 常用的格式化字符串有:
%Y
:四位数的年份,如 2024。%m
:两位数的月份,范围从 01 到 12。%d
:两位数的日期,范围从 01 到 31。%H
:24 小时制的小时数,范围从 00 到 23。%M
:分钟数,范围从 00 到 59。%S
:秒数,范围从 00 到 59。
strptime
函数:将字符串形式转换为tm
结构
strptime
函数与strftime
函数相反,用于将字符串形式的时间转换为tm
结构。其基本语法如下:
struct tm* strptime(const char* s, const char* format, struct tm* timeptr);
- 例如,将一个指定格式的字符串时间转换为
tm
结构:
#include <iostream> #include <ctime> int main() { char time_str[] = "2024-10-31 23:59:59"; struct tm time_struct; strptime(time_str, "%Y-%m-%d %H:%M:%S", &time_struct); std::cout << "Year: " << time_struct.tm_year + 1900 << std::endl; std::cout << "Month: " << time_struct.tm_mon + 1 << std::endl; std::cout << "Day: " << time_struct.tm_mday << std::endl; std::cout << "Hour: " << time_struct.tm_hour << std::endl; std::cout << "Minute: " << time_struct.tm_min << std::endl; std::cout << "Second: " << time_struct.tm_sec << std::endl; return 0; }
3. 自定义时间格式转换类(拓展内容)
- 除了使用标准库中的函数进行时间形式转换外,还可以创建自定义的时间格式转换类来满足更复杂的需求。例如,以下是一个简单的类,用于在特定的日期格式之间进行转换:
#include <iostream> #include <string> #include <ctime> #include <sstream> class CustomTimeConverter { public: static std::string convertToFormat(const std::string& input_time, const std::string& input_format, const std::string& output_format) { struct tm time_struct; strptime(input_time.c_str(), input_format.c_str(), &time_struct); char buffer[80]; strftime(buffer, sizeof(buffer), output_format.c_str(), &time_struct); return std::string(buffer); } }; int main() { std::string input_time = "2024-10-31 23:59:59"; std::string output_time = CustomTimeConverter::convertToFormat(input_time, "%Y-%m-%d %H:%M:%S", "%d/%m/%Y %H:%M:%S"); std::cout << "Output time: " << output_time << std::endl; return 0; }
- 在这个类中,
convertToFormat
方法接受一个输入时间字符串、输入时间格式和输出时间格式,通过strptime
和strftime
函数实现时间格式的转换。
C++ 中的时间形式转换主要通过标准库中的time_t
类型、tm
结构以及相关函数来实现,这些工具可以满足大多数常见的时间处理和转换需求,同时也可以通过自定义类来扩展时间转换的功能。