三行代码  ›  专栏  ›  技术社区  ›  kadina

如何检查给定的年、月、日和时间格式在C++中是否有效?

  •  0
  • kadina  · 技术社区  · 1 月前

    我正在开发一个应用程序,其中日志文件的命名格式为“YYYYMMDDHHMM\u****.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\u****的文件。gz“”和目录中14天的。但time\u t没有为无效的日期时间格式提供-1。有没有人能告诉我是否有任何方法可以检查给定的日期是否有效,或者我是否需要手动检查?

    1 回复  |  直到 1 月前
        1
  •  3
  •   Sam Varshavchik    1 月前

    你需要检查一下 std::get_time 它本身失败了。失败的操作是转换,而不是构造 time_t 结果中的值 struct tm .

    这个 sample code on cppreference.com 提供了一个非常简单的示例,说明如何做到这一点:

        ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
        if (ss.fail()) {
            std::cout << "Parse failed\n";
    

    什么时候 std::get\u时间 failes它将输入流设置为失败状态,所以您所要做的就是进行检查。