std::get_time 简介

645 阅读4分钟

std::get_time 是 C++11 引入的一个标准库函数,用于将字符串解析为 tm 结构体,通常用于日期和时间的格式化。它属于 <iomanip> 头文件,并且与 C 标准库中的 strptime 函数具有类似的功能,提供了一种方便的方式来将文本格式的日期时间字符串转换为结构化的 tm 类型,供后续的日期时间计算或处理。

1. std::get_time 函数简介

std::get_time 函数的主要作用是从输入流中读取日期或时间字符串,并将其解析为 tm 结构体。这个结构体是 C 标准库中定义的,包含了时间的各个部分,例如年、月、日、小时、分钟、秒等。

函数签名:

std::istream& std::get_time(std::istream& in, std::tm& time, const char* format);
  • 参数

    • in:输入流对象,通常是 std::cinstd::istringstream,用于读取输入的时间字符串。
    • timetm 结构体,用于存储解析得到的时间信息。
    • format:格式化字符串,用于指定输入日期时间字符串的格式。
  • 返回值:返回 std::istream&,以便进行链式调用。若解析成功,输入流的状态将保持良好;若解析失败,输入流的状态将变为坏流(fail)。

2. tm 结构体

tm 结构体用于表示时间,包括以下字段:

struct tm {
    int tm_sec;   // 秒数 [0, 59]
    int tm_min;   // 分钟数 [0, 59]
    int tm_hour;  // 小时数 [0, 23]
    int tm_mday;  // 月中的日期 [1, 31]
    int tm_mon;   // 月份 [0, 11]
    int tm_year;  // 从1900年起的年份
    int tm_wday;  // 星期几 [0, 6],从星期天开始
    int tm_yday;  // 一年的天数 [0, 365]
    int tm_isdst; // 夏令时标志
};

3. 使用 std::get_time 解析时间字符串

std::get_time 主要用于从字符串中提取时间信息。例如,我们可以将一个日期时间字符串(如 "2024-12-25 15:30:00")解析为 tm 结构体,并使用其中的各个字段进行进一步操作。

示例代码:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <ctime>

int main() {
    std::string date_str = "2024-12-25 15:30:00";  // 要解析的时间字符串
    std::istringstream input(date_str);
    std::tm time = {};

    // 使用 std::get_time 解析时间字符串
    input >> std::get_time(&time, "%Y-%m-%d %H:%M:%S");

    if (input) {
        // 如果解析成功,输出解析的结果
        std::cout << "Year: " << time.tm_year + 1900 << std::endl;  // tm_year 是从1900开始
        std::cout << "Month: " << time.tm_mon + 1 << std::endl;     // tm_mon 是从0开始
        std::cout << "Day: " << time.tm_mday << std::endl;
        std::cout << "Hour: " << time.tm_hour << std::endl;
        std::cout << "Minute: " << time.tm_min << std::endl;
        std::cout << "Second: " << time.tm_sec << std::endl;
    } else {
        // 如果解析失败,输出错误信息
        std::cerr << "Error: Unable to parse date/time" << std::endl;
    }

    return 0;
}

解释:

  • 我们使用 std::get_time 来解析时间字符串 "2024-12-25 15:30:00"
  • "%Y-%m-%d %H:%M:%S" 是格式化字符串,指定了输入日期时间字符串的格式。具体来说:
    • %Y:四位数的年份(如 2024)
    • %m:两位数的月份(如 12)
    • %d:两位数的日(如 25)
    • %H:24小时制的小时(如 15)
    • %M:分钟(如 30)
    • %S:秒(如 00)
  • std::get_time 将解析的结果存储在 std::tm 结构体中,并可以通过字段访问各个时间组件。

4. 格式化字符串说明

std::get_time 使用的格式化字符串遵循与 C 标准库函数 strftime 相同的格式。以下是一些常见的格式说明:

  • %Y:四位数的年份
  • %m:两位数的月份
  • %d:两位数的日
  • %H:24小时制的小时
  • %M:分钟
  • %S:秒
  • %a:星期几的缩写
  • %A:星期几的全称

更多的格式说明符,可以参考 C 标准库文档中的 strftime 函数。

5. 解析失败处理

std::get_time 可能会失败,特别是在输入的时间字符串与格式不匹配时。例如,如果字符串 "2024-12-32 15:30:00" 传递给 std::get_time,由于没有 32 号日,这将导致解析失败。可以通过检查输入流的状态来检测解析失败。

if (input.fail()) {
    std::cerr << "Error: Parsing failed" << std::endl;
}

6. 总结

std::get_time 是 C++ 中非常方便的时间解析工具,能够将格式化的日期时间字符串解析为 tm 结构体。在许多实际应用中,尤其是在处理日期和时间数据时,它非常有用。通过合理地使用格式化字符串和 tm 结构体,可以轻松地处理时间数据并进行进一步操作,如日期计算、格式化输出等。