在軟件開發中,時間是無處不在的一個概念,無論是日志記錄、定時任務還是用戶界面,時間的處理都至關重要。C++標準庫提供了一套完整的工具來幫助我們處理時間相關的操作。本文將詳細介紹幾個時間操作函數的使用場景、代碼實現以及它們在實際開發中的應用。
函數列表與使用場景
-
判斷當前秒數是否是指定的秒數 -
isCurrentSecond
- 使用場景:定時任務觸發、性能測試中的特定時間點檢查等。
-
獲取當前時間的分鐘部分 -
getCurrentTimeMinute
- 使用場景:生成時間戳、日志記錄、定時備份等。
-
將time_point轉換為格式化的字符串 -
formatTimePoint
- 使用場景:日志輸出、用戶界面顯示、數據格式化等。
-
獲取兩個時間點之間的所有分鐘字符串 -
getMinutesInRange
- 使用場景:生成時間范圍內的報告、時間序列分析等。
-
將時間字符串轉換為MySQL的DATETIME格式 -
convertToMySqlDateTime
- 使用場景:數據庫時間數據的插入、更新等操作。
-
檢查輸入數據是否是合法的年月日時分秒 -
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 直接分享源碼庫。
分享一個有趣的 學習鏈接