我正在開發一個應用程式,其中日志檔案將以“YYYYMMDDHHMM_****.gz”格式命名。日志檔案包含 YYYY(年)、MM(月)、DD(日)、HH(小時)和 MM(分鐘)。我的類建構式需要檢查檔案名是否有效(年月日時間是否有效)。我認為通過將這些值傳遞給 time_t 結構,它將為無效值回傳 -1。但它沒有回傳-1。
下面是程式。
#include <iostream>
#include <iomanip>
#include <ctime>
#include <sstream>
int main() {
struct tm tm{};
std::istringstream iss("2018 12 22 00:26:00");
//std::istringstream iss("2018 12 aa 00:26:00"); --> THIS IS NOT -1
iss >> std::get_time(&tm, "%Y %m %d %H:%M:%S");
time_t time = mktime(&tm);
std::cout << time << std::endl;
std::cout << std::ctime(&time) << std::endl;
return 0;
}
輸出/輸出:
1545438360
Sat Dec 22 00:26:00 2018
但是,如果我將日期指定為“2018 12 aa 00:26:00”(月份:aa 無效),它仍然會列印一些有效的 o/p。
輸出/輸出:
1543536000
Fri Nov 30 00:00:00 2018
我需要丟棄檔案名格式為“YYYYMMDDHHMM_****.gz”且在目錄中已有 14 天的檔案。但是 time_t 沒有為無效的日期時間格式提供 -1。任何人都可以讓我知道是否有任何方法可以檢查給定日期是否有效,或者我需要手動檢查嗎?
uj5u.com熱心網友回復:
您需要檢查std::get_time自身是否失敗。失敗的操作是轉換,而不是time_t從結果中構造一個值struct tm。
cppreference.com 上的示例代碼提供了一個非常容易遵循的示例,說明如何做到這一點:
ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
if (ss.fail()) {
std::cout << "Parse failed\n";
當std::get_time失敗時,它會將輸入流設定為失敗狀態,因此您要做的就是檢查它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495868.html
