技术分享:深入C++时间操作函数的应用与实践

在软件开发中,时间是无处不在的一个概念,无论是日志记录、定时任务还是用户界面,时间的处理都至关重要。C++标准库提供了一套完整的工具来帮助我们处理时间相关的操作。本文将详细介绍几个时间操作函数的使用场景、代码实现以及它们在实际开发中的应用。

函数列表与使用场景

  1. 判断当前秒数是否是指定的秒数 - isCurrentSecond

    • 使用场景:定时任务触发、性能测试中的特定时间点检查等。
  2. 获取当前时间的分钟部分 - getCurrentTimeMinute

    • 使用场景:生成时间戳、日志记录、定时备份等。
  3. 将time_point转换为格式化的字符串 - formatTimePoint

    • 使用场景:日志输出、用户界面显示、数据格式化等。
  4. 获取两个时间点之间的所有分钟字符串 - getMinutesInRange

    • 使用场景:生成时间范围内的报告、时间序列分析等。
  5. 将时间字符串转换为MySQL的DATETIME格式 - convertToMySqlDateTime

    • 使用场景:数据库时间数据的插入、更新等操作。
  6. 检查输入数据是否是合法的年月日时分秒 - isValidDateTime

    • 使用场景:用户输入验证、数据导入前的数据校验等。

代码实现与注释

以下是每个函数的详细介绍和注释。

1. 判断当前秒数是否是指定的秒数
bool isCurrentSecond(int targetSecond) {// 获取当前时间点auto now = std::chrono::system_clock::now();// 转换为time_t类型std::time_t nowTimeT = std::chrono::system_clock::to_time_t(now);// 转换为tm结构体struct tm nowTm;localtime_r(&nowTimeT, &nowTm); // 使用localtime_r是线程安全的// 获取当前的秒数int currentSecond = nowTm.tm_sec;// 判断当前秒数是否是指定的秒数return currentSecond == targetSecond;
}
2. 获取当前时间的分钟部分
std::string getCurrentTimeMinute() {// 获取当前时间点auto now = std::chrono::system_clock::now();// 转换为time_t类型std::time_t nowTimeT = std::chrono::system_clock::to_time_t(now);// 转换为tm结构体struct tm nowTm;gmtime_r(&nowTimeT, &nowTm); // 使用gmtime_r来避免时区的影响// 使用stringstream和iomanip来格式化时间字符串为"YYYYMMDDHHMM"格式std::stringstream ss;ss << std::put_time(&nowTm, "%Y%m%d%H%M");// 返回格式化的时间字符串return ss.str();
}
3. 将time_point转换为格式化的字符串
std::string formatTimePoint(const std::chrono::system_clock::time_point& timePoint) {// 将time_point转换为time_tauto tt = std::chrono::system_clock::to_time_t(timePoint);// 使用gmtime来避免时区问题std::tm tm = *std::gmtime(&tt);// 使用stringstream和put_time来格式化时间为"YYYYMMDDHHMM"格式std::stringstream ss;ss << std::put_time(&tm, "%Y%m%d%H%M");// 返回格式化的时间字符串return ss.str();
}
4. 获取两个时间点之间的所有分钟字符串
std::vector<std::string> getMinutesInRange(const std::string& startTimeStr, const std::string& endTimeStr) {// 解析时间字符串为time_pointstd::tm startTimeTm, endTimeTm;std::istringstream ssStartTime(startTimeStr);std::istringstream ssEndTime(endTimeStr);// 使用get_time来解析时间字符串ssStartTime >> std::get_time(&startTimeTm, "%Y%m%d%H%M");ssEndTime >> std::get_time(&endTimeTm, "%Y%m%d%H%M");// 转换tm结构体为time_pointstd::chrono::system_clock::time_point startTime = std::chrono::system_clock::from_time_t(std::mktime(&startTimeTm));std::chrono::system_clock::time_point endTime = std::chrono::system_clock::from_time_t(std::mktime(&endTimeTm));// 存储分钟字符串的向量std::vector<std::string> minutes;// 循环遍历两个时间点之间的每一分钟for (auto currentTime = startTime; currentTime <= endTime; currentTime += std::chrono::minutes(1)) {// 将当前时间点格式化为字符串并添加到向量中minutes.push_back(formatTimePoint(currentTime));}// 返回包含所有分钟字符串的向量return minutes;
}
5. 将时间字符串转换为MySQL的DATETIME格式
std::string convertToMySqlDateTime(const std::string &timeStr, bool forceFormat = false) {// MySQL的DATETIME格式为"YYYY-MM-DD HH:MM:SS"const std::string mysqlFormat = "%Y-%m-%d %H:%M:%S";std::istringstream iss(timeStr);int year, month, day, hour, minute, second;char dash1, dash2, colon1, colon2;// 如果需要强制格式化,则调整输入字符串if (forceFormat) {if (timeStr.length() < 14) {// 如果时间字符串长度不足14位,则补零std::string paddedStr = timeStr;paddedStr.resize(14, '0');iss.str(paddedStr);} else if (timeStr.length() > 14) {// 如果时间字符串长度超过14位,则截断iss.str(timeStr.substr(0, 14));}}// 解析时间字符串if (!(iss >> year >> dash1 >> month >> dash2 >> day >> colon1 >> hour >> colon2 >> minute >> second)) {// 如果解析失败,返回空字符串return "";}// 构建MySQL的DATETIME格式字符串std::ostringstream oss;oss << std::setfill('0') << std::setw(4) << year << "-"<< std::setw(2) << month << "-"<< std::setw(2) << day << " "<< std::setw(2) << hour << ":"<< std::setw(2) << minute << ":"<< std::setw(2) << second;// 返回格式化后的字符串return oss.str();
}
6. 检查输入数据是否是合法的年月日时分秒
bool isValidDateTime(const std::string &timeStr) {// 设置istringstream以两位数字的格式提取日期和时间的各个部分std::istringstream iss(timeStr);int year, month, day, hour, minute, second;char dash1, dash2, colon1, colon2;// 解析时间字符串if (!(iss >> std::setw(4) >> year >> dash1 >> std::setw(2) >> month >> dash2 >> std::setw(2) >> day>> colon1 >> std::setw(2) >> hour >> colon2 >> std::setw(2) >> minute >> second)) {// 如果解析失败,返回falsereturn false;}// 检查年份是否在合理的范围内if (year < 0 || year > 9999) return false;// 检查月份是否在1到12之间if (month < 1 || month > 12) return false;// 检查日期是否在1到31之间if (day < 1 || day > 31) return false;// 检查小时是否在0到23之间if (hour < 0 || hour > 23) return false;// 检查分钟和秒是否在0到59之间if (minute < 0 || minute > 59) return false;if (second < 0 || second > 59) return false;// 如果所有检查都通过,则返回truereturn true;
}

结论

通过上述函数的介绍和代码实现,我们可以看到C++标准库在处理时间方面的功能是非常全面和强大的。这些函数不仅可以帮助我们完成日常的时间处理任务,还可以在复杂的时间计算和格式化中发挥重要作用。希望这篇技术分享能够帮助你更好地理解和使用C++中的时间操作函数。

点赞过20 直接分享源码库。


分享一个有趣的 学习链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

42-5 应急响应之日志分析

一、Windows 系统日志排查 1)日志概述 在 Windows 2000 专业版、Windows XP 和 Windows Server 2003 中: 系统日志的位置为 C:\WINDOWS\System32\config\SysEvent.evt安全性日志的位置为 C:\WINDOWS\System32\config\SecEvent.evt应用程序日志的位置为 C:\WINNT\System32\c…

牛客周赛 Round 44VP

1.签到&#xff1a;https://ac.nowcoder.com/acm/contest/82526/A AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n; int main() {cin>>n;cout<<n/3; } 2.思维&#xff1a;https://ac.nowcoder.com/acm/contest/82526/B 就是判断最…

【漏洞复现】海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行

0x01 漏洞名称 海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行 0x02 漏洞影响 0x03 搜索引擎 app"HIKVISION-综合安防管理平台"0x04 漏洞详情 POST /bic/ssoService/v1/applyCT HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Wi…

NASA数据集——阿尔法喷气式大气实验二氧化碳和甲烷数据

Alpha Jet Atmospheric eXperiment Carbon Dioxide and Methane Data 阿尔法喷气式大气实验二氧化碳和甲烷数据 简介 Alpha Jet Atmospheric eXperiment (AJAX) 是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达…

Kafka 实战 - Kafka Consumer 重置 Offset

在开发测试过程中&#xff0c;可能需要消费一段时间的消息&#xff0c;来验证数据的可靠性&#xff0c;这里需要消费者&#xff08;Consumer&#xff09;重置其消费的偏移量&#xff08;Offset&#xff09;。 以下是几种常用的方法来重置Kafka Consumer的Offset&#xff1a; …

vue+iview tabs context-menu 弹出框怎么修改样式

今天遇到一个需求说页面顶部的菜单右键弹出框离得有点远 代码是这样 <Tabs type"card" closable class"main-tags-col-tabs" v-model"activeTab" on-click"handleClickTag" :before-remove"handleBeforeRemove" capt…

什么是容器:从基础到进阶的全面介绍

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

libjpeg_example.txt

/* 示例.txt该文件说明了如何使用IJG代码作为子程序库读取或写入JPEG图像文件。你应该看看这段代码与文档文件 libjpeg.txt 结合使用。这段代码按原样不会做任何有用的事情&#xff0c;但它可能会有所帮助用于构建调用 JPEG 库的例程的骨架。我们以 JPEG 代码中使用的相同编码…

Java中的内部类及其用途

一、技术难点 在Java中&#xff0c;内部类是一个定义在另一个类内部的类。这种嵌套的结构带来了一些技术上的难点和挑战&#xff1a; 访问控制&#xff1a;内部类可以直接访问外部类的所有成员&#xff08;包括私有成员&#xff09;&#xff0c;但外部类不能直接访问内部类的…

Vue3实战笔记(44)—vue3组件的ref属性

文章目录 前言一、组件的ref用法总结总结 前言 之前学习过ref声明响应式对象&#xff0c;前几天读代码遇到了发懵的地方&#xff0c;详细学习了一下才发现&#xff0c;用法还有很多&#xff0c;遂总结一下ref的用法备忘。 一、组件的ref用法总结 Vue3 中的 ref 是一种创建响应…

【Linux 网络】网络基础(三)(网络层协议:IP 协议)

在复杂的网络环境中确定一个合适的路径。 一、TCP 与 IP 的关系 IP 层的核心作用是定位主机&#xff0c;具有将数据从主机 A 发送到主机 B 的能力&#xff0c;但是能力并不能保证一定能够做到&#xff0c;所以这时就需要 TCP 起作用了&#xff0c;TCP 可以通过超时重传、拥塞控…

【必备工具】gitee上传-保姆级教程

目录 1.gitee是什么 2.gitee怎么注册 ​编辑 3.gitee怎么提交代码 4.gitee的三板斧 Clone仓库 Q&A 1. Gitee 只有三板斧吗&#xff1f; 2. Git 教了&#xff0c;Gitee 上没有绿点怎么办&#xff1f; 3. 用户名和密码输入错误怎么办&#xff1f; 4. 操作时不小心…

【c++基础】和谐分组

题目描述 s 班共有 n 名学生&#xff0c;按照学号从 1 到的顺序每名学生的身高分别为 a[1],a[2]...a[n]。由于是新学期&#xff0c;s 班需要进行分组&#xff0c;分组的要求如下&#xff1a; 进行分组的组数不能超过 k。 每组的人的学号必须相邻。 由于身高差过大的人分在同一…

wordpress主题给网站增加一个版权声明区块代码分享

在数字化时代&#xff0c;网络上的信息传播变得越来越便捷&#xff0c;给人们生活和工作带来了极大的便利。然而&#xff0c;在这个过程中也产生了很多版权问题。为了更好地保护自己的版权&#xff0c;许多网站开始在其网页上添加版权声明。本文将探讨在网站上添加版权声明的重…

Gitee的原理及应用详解(二)

本系列文章简介&#xff1a; Gitee是一款开源的代码托管平台&#xff0c;是国内最大的代码托管平台之一。它基于Git版本控制系统&#xff0c;提供了代码托管、项目管理、协作开发、代码审查等功能&#xff0c;方便团队协作和项目管理。Gitee的出现&#xff0c;在国内的开发者社…

31.线性变换及对应矩阵

文章目录 1. 线性变换2. 投影矩阵 1. 线性变换 线性代数从线性变换开始&#xff0c;是线性代数的另外一个起点。很多物理学家并不关系坐标的值&#xff0c;而是关系从A坐标系到B坐标系的变化。他们希望知道如何去描述一个变化&#xff0c;而现在我们研究的就是通过矩阵来描述这…

机器人运动轨迹学习——GMM/GMR算法

机器人运动轨迹学习——GMM/GMR算法 前置知识 GMM的英文全称为&#xff1a;Gaussian mixture model&#xff0c;即高斯混合模型&#xff0c;也就是说&#xff0c;它是由多个高斯模型进行混合的结果&#xff1a;当然&#xff0c;这里的混合是带有权重概念的。 一维高斯分布 GMM中…

基于STM32与ESP8266 驱动的智能大棚环境监测控制系统

随着物联网技术的快速发展&#xff0c;智能农业逐渐成为现代农业发展的重要方向。本文介绍了一种基于STM32微控制器和ESP8266 Wi-Fi模块的智能大棚环境监测控制系统。该系统能够实时监测和控制大棚内的环境参数&#xff0c;如温度、湿度、光照强度和土壤湿度等&#xff0c;并通…

win11安装MySQL

目录[-] 1. 1. 下载2. 2. 安装 参考文档&#xff1a;MySQL :: MySQL 8.4 Reference Manual 1. 下载 mysql官网下载msi安装程序&#xff1a;MySQL :: Begin Your Download 2. 安装 运行下载的mis程序,逐步安装。 安装模式&#xff1a; complete; 进入配置&#xff1a; data di…