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


  • 可以通过localtime或gmtime函数将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是格式化字符串,timeptr是tm结构的指针。
  • 例如,将当前时间转换为指定格式的字符串:


#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方法接受一个输入时间字符串、输入时间格式和输出时间格式,通过strptime和strftime函数实现时间格式的转换。


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

相关文章
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
2747 11
|
存储 Linux
linux echo 写入文件
通过这些技巧和示例,你可以灵活运用 `echo`命令,无论是进行简单的文本输出还是复杂的文件操作,都能在Linux环境中游刃有余。
1935 1
|
Prometheus 监控 Cloud Native
Grafana 最全详解 ( 图文全面总结 )
Grafana是非常重要的微服务部署监控工具,被广泛应用于大型网站架构,本文全面详解。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Grafana 最全详解  ( 图文全面总结 )
|
前端开发 JavaScript API
使用 JavaScript 实现图片上传
使用 JavaScript 实现图片上传
608 1
|
人工智能 API Android开发
LLM大模型知识整理大全
本文介绍了多个大模型训练和部署工具及教程。使用unsloth支持llama3,显存占用约8G;GPT4ALL加载训练好的大模型;llama.cpp进行4bit量化后可用CPU运行。MAID手机App和MLC软件可在安卓设备上本地运行大模型或调用API。FASTGPT用于客制化大模型和AI私有化客服。相关教程链接已提供。
743 12
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
2969 1
|
存储 监控 数据挖掘
Kylin使用心得与实战经验分享
本文详细介绍了Apache Kylin的使用方法及其在大数据分析中的优势。首先,Kylin是一款基于Hadoop和Spark的开源分布式分析引擎,通过预计算技术实现亚秒级的交互式查询响应,大幅提高数据分析效率。接着,文章阐述了Kylin的核心特点,包括高效多维分析能力和预计算与实时查询的平衡。然后,详细说明了环境搭建、配置步骤及示例代码,展示了如何配置HBase存储后端。在数据建模与优化部分,讲解了星型模型和雪花模型的选择,以及分区策略和索引优化技巧。
一文搞懂正则表达式之零宽断言
零宽断言: 用于查找在某些内容之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。
1094 0
一文搞懂正则表达式之零宽断言
|
存储 定位技术 数据库
介绍一下数据库的备份和恢复策略
【10月更文挑战第21】介绍一下数据库的备份和恢复策略
|
存储 Java 计算机视觉
如何在Spring Boot中实现图像上传和处理
如何在Spring Boot中实现图像上传和处理

热门文章

最新文章