c++时间形式转换

简介: 【10月更文挑战第29天】在 C++ 中,时间形式转换主要涉及将时间在不同表示形式之间转换,如字符串与 `tm` 结构或 `time_t` 类型之间的转换。常用的基本时间类型包括 `time_t` 和 `tm` 结构,转换函数有 `strftime` 和 `strptime`,可以满足大多数时间处理需求。此外,还可以通过自定义类来扩展时间转换功能。

在 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; // 夏令时标志
};


  • 可以通过localtimegmtime函数将time_t类型的时间转换为tm结构,前者返回本地时间,后者返回格林威治标准时间(GMT)。例如:


#include <iostream>
#include <ctime>
int main() {
    time_t current_time = time(nullptr);
    struct tm* local_time = localtime(&current_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是格式化字符串,timeptrtm结构的指针。
  • 例如,将当前时间转换为指定格式的字符串:


#include <iostream>
#include <ctime>
int main() {
    time_t current_time = time(nullptr);
    struct tm* local_time = localtime(&current_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方法接受一个输入时间字符串、输入时间格式和输出时间格式,通过strptimestrftime函数实现时间格式的转换。


C++ 中的时间形式转换主要通过标准库中的time_t类型、tm结构以及相关函数来实现,这些工具可以满足大多数常见的时间处理和转换需求,同时也可以通过自定义类来扩展时间转换的功能。

相关文章
|
JavaScript 前端开发 API
`toISOString()` 方法将日期对象转换为字符串
`toISOString()` 方法将日期对象转换为字符串
342 1
|
JSON 小程序 JavaScript
小程序返回的时间戳转化成时间
小程序返回的时间戳转化成时间
54 0
|
JSON 前端开发 数据格式
全局日期请求转换处理
全局日期请求转换处理
81 0
|
Linux
time模块: 时间戳、结构化时间、格式化时间的获取与相互转化
time模块: 时间戳、结构化时间、格式化时间的获取与相互转化
136 0
|
自然语言处理 Python
一日一技:把自然语言描述的时间转成标准格式
一日一技:把自然语言描述的时间转成标准格式
274 0
如何将Excel中以文本形式存储的数字批量快速地转换为数值类型
如何将Excel中以文本形式存储的数字批量快速地转换为数值类型
如何将Excel中以文本形式存储的数字批量快速地转换为数值类型
7-168 币值转换 (20 分)
7-168 币值转换 (20 分)
106 0
Java 输入一个字符串格式日期,获取对应的自然月开始结束时间,对应的自然年开始结束时间
Java 输入一个字符串格式日期,获取对应的自然月开始结束时间,对应的自然年开始结束时间
278 0
Java 输入一个字符串格式日期,获取对应的自然月开始结束时间,对应的自然年开始结束时间
|
前端开发
前端工作小结61-时间戳转换
前端工作小结61-时间戳转换
110 0
时间戳与实践的转化(CIOTimer)
时间戳与实践的转化(CIOTimer)
143 0
时间戳与实践的转化(CIOTimer)