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结构以及相关函数来实现,这些工具可以满足大多数常见的时间处理和转换需求,同时也可以通过自定义类来扩展时间转换的功能。

相关文章
C# DEV 关于设置gridview 指定单元格字体为红色
C# DEV 关于设置gridview 指定单元格字体为红色
|
9月前
|
JSON 生物认证 API
harmony-utils之PasteboardUtil,剪贴板工具类
harmony-utils 是一款功能丰富且易用的 HarmonyOS 工具库,提供剪贴板、设备、屏幕、授权等常用工具类,助力开发者高效构建鸿蒙应用。
197 0
|
8月前
|
人工智能 自然语言处理 搜索推荐
从扣子空间看 AI 智能体:与豆包、Kimi 较量及未来走向
本文探讨了当前 AI 智能体的发展现状、功能特点及其与传统 AI 大模型的差异,分析了其使用门槛与未来发展趋势,展望了其在多领域应用的潜力与挑战。
2081 0
|
算法 数据安全/隐私保护 C++
超级好用的C++实用库之Des加解密
超级好用的C++实用库之Des加解密
451 0
|
存储 监控 数据挖掘
Kylin使用心得与实战经验分享
本文详细介绍了Apache Kylin的使用方法及其在大数据分析中的优势。首先,Kylin是一款基于Hadoop和Spark的开源分布式分析引擎,通过预计算技术实现亚秒级的交互式查询响应,大幅提高数据分析效率。接着,文章阐述了Kylin的核心特点,包括高效多维分析能力和预计算与实时查询的平衡。然后,详细说明了环境搭建、配置步骤及示例代码,展示了如何配置HBase存储后端。在数据建模与优化部分,讲解了星型模型和雪花模型的选择,以及分区策略和索引优化技巧。
QtCreater增加自动添加注释的快捷代码
QtCreater增加自动添加注释的快捷代码
991 0
|
Java API 文件存储
Android:常用的隐式 Intent
本篇文章的内容其实是属于上一篇文章(Android 基础知识5:Intent 和 Intent 过滤器)的延伸,考虑到篇幅长度的原因,所以没有把本篇文章的内容写到上一篇文章中,另外单独写成一篇文章还有个好处就是方便读者查阅。这篇文章主要为大家列举了常用的隐式 Intent,大家如果在平时工作中有相关的需求可以直接复制代码使用。
603 0
Android:常用的隐式 Intent
|
前端开发 关系型数据库 MySQL
开源测试平台横向测评系列『流马』篇:流马部署
【简介篇】 • 项目概述:技术栈、工作原理 • 项目功能简介:功能特点 【部署篇】 • 部署规划 • 依赖环境部署(JDK、MySQ、NGINX、Git、NodeJS、Python3) • 代码打包:克隆项目、前端代码打包、后端代码打包 • 项目部署:前端部署、后端部署、执行引擎部署
开源测试平台横向测评系列『流马』篇:流马部署
|
小程序 JavaScript
微信小程序-image组件
图片组件。支持 JPG、PNG、SVG、WEBP、GIF 等格式,2.3.0 起支持云文件ID。
785 0

热门文章

最新文章