在软件开发中,时间是无处不在的一个概念,无论是日志记录、定时任务还是用户界面,时间的处理都至关重要。C++标准库提供了一套完整的工具来帮助我们处理时间相关的操作。本文将详细介绍几个时间操作函数的使用场景、代码实现以及它们在实际开发中的应用。
函数列表与使用场景
-
判断当前秒数是否是指定的秒数 -
isCurrentSecond
- 使用场景:定时任务触发、性能测试中的特定时间点检查等。
-
获取当前时间的分钟部分 -
getCurrentTimeMinute
- 使用场景:生成时间戳、日志记录、定时备份等。
-
将time_point转换为格式化的字符串 -
formatTimePoint
- 使用场景:日志输出、用户界面显示、数据格式化等。
-
获取两个时间点之间的所有分钟字符串 -
getMinutesInRange
- 使用场景:生成时间范围内的报告、时间序列分析等。
-
将时间字符串转换为MySQL的DATETIME格式 -
convertToMySqlDateTime
- 使用场景:数据库时间数据的插入、更新等操作。
-
检查输入数据是否是合法的年月日时分秒 -
isValidDateTime
- 使用场景:用户输入验证、数据导入前的数据校验等。
代码实现与注释
以下是每个函数的详细介绍和注释。
1. 判断当前秒数是否是指定的秒数
cpp
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. 获取当前时间的分钟部分
cpp
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转换为格式化的字符串
cpp
std::string formatTimePoint(const std::chrono::system_clock::time_point& timePoint) {
// 将time_point转换为time_t
auto 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. 获取两个时间点之间的所有分钟字符串
cpp
std::vector<std::string> getMinutesInRange(const std::string& startTimeStr, const std::string& endTimeStr) {
// 解析时间字符串为time_point
std::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_point
std::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格式
cpp
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. 检查输入数据是否是合法的年月日时分秒
cpp
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)) {
// 如果解析失败,返回false
return 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;
// 如果所有检查都通过,则返回true
return true;
}
结论
通过上述函数的介绍和代码实现,我们可以看到C++标准库在处理时间方面的功能是非常全面和强大的。这些函数不仅可以帮助我们完成日常的时间处理任务,还可以在复杂的时间计算和格式化中发挥重要作用。希望这篇技术分享能够帮助你更好地理解和使用C++中的时间操作函数。
点赞过20 直接分享源码库。
分享一个有趣的 学习链接