我正在开发一个应用程序,其中日志文件将以"YYYYMMDDHHMM_****.gz“格式命名。日志文件包含YYYY (年份)、MM (月份)、DD (日)、HH (小时)和MM (分钟)。我的类构造函数需要检查文件名是否有效(年份、月、日和时间是否有效)。我认为通过将这些值传递给time_t结构,它将返回无效值的-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;
}O/P:
1545438360
Sat Dec 22 00:26:00 2018但如果我给出的日期为“2018年12 aa 00:26:00" (月份: aa无效),它仍在打印一些有效的操作/p。
O/P:
1543536000
Fri Nov 30 00:00:00 2018我需要丢弃那些文件名为“YYYYMMDDHHMM_****.gz”格式的文件,这些文件在目录中有14天的历史。但是time_t没有为无效的日期时间格式提供-1。有谁可以让我知道是否有任何方法来检查给定的日期是否有效,或者我是否需要手动检查?
发布于 2022-06-27 02:29:49
您需要检查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://stackoverflow.com/questions/72766402
复制相似问题