【问题标题】:Get hours and minutes from std::string boost c++从 std::string boost c++ 获取小时和分钟
【发布时间】:2017-09-25 08:00:09
【问题描述】:

我只想从 boost C++ 中的 std::string 日期时间获取小时和分钟。 我有以下代码。

std::string d_time = std::string("2017-09-25 12:23:10");

我可以通过对上面的字符串进行标记来获得它,但是是否有任何标准的 boost 函数只能给出 "d_time" 的小时和分钟?

提前致谢。

【问题讨论】:

  • 有些系统有一个叫做strptime的函数,可以把时间和日期字符串转换成struct tm,从中你可以得到你想要的信息。你可以检查一下。
  • 您还可以将std::get_timestd::istringstream 结合使用。
  • 但是 struct tm 在 windows 中不可用吗?
  • 如果您在std 命名空间中有函数,您可以确定它来自标准,并且任何符合标准的编译器都必须完整地实现它。包括像std::tm 这样的结构。平台无关紧要(请记住,struct tm 是最初来自 C 标准的旧结构,并且已在包括 Windows 在内的所有平台上存在了很长时间)。
  • "std::get_time" 和 "std::put_time" 在 gcc

标签: c++ boost


【解决方案1】:

如果您使用的编译器/标准库版本不能正确实现 put_time/get_time 操纵器,这里有一小段使用 Boost DateTime 的代码

Live On Wandbox

#include <boost/date_time/posix_time/posix_time.hpp>

using boost::posix_time::time_from_string;

int main() {
    auto time = time_from_string("2017-09-25 12:23:10").time_of_day();;

    int hours = time.hours();
    int minutes = time.minutes();

    std::cout << "hours: " << hours << " minutes:" << minutes << "\n";
}

【讨论】:

  • 编译错误提示“class boost::posix_time::ptime' has no member named 'hours'”
  • 有一个现场演示。仔细观察(你忘了time_of_day() 电话)
【解决方案2】:

函数std::get_timestd::put_time 可以帮助您。

此类函数使用stream 对象进行操作,因此如果您想处理字符串,可以使用stringstream

std::istringstream time_stream{d_time};  // Construct a stream from string
std::tm time;  // Time structure
time_stream >> std::get_time(&time, "%Y-%m-%d %H:%M:%S");  // Fill time struct

一旦您正确初始化了std::tm 结构,您就可以提取所需的信息(小时和分钟)。

Here 现场演示。

请注意,这些函数是标准 C++11 的一部分。

【讨论】:

  • 还要注意 gcc 4.x 即使在 C++11 模式下也没有实现它。你至少需要 5.x
  • 这里,如果我们使用旧版本的 gcc
  • 在 debian 10 和 std::get_time 上使用 g++8.3 未正确实现:不允许在没有前面 0 的情况下使用一位数的月份天数......所以下面的提升解决方案肯定是首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2022-01-17
  • 2012-04-13
  • 2014-10-17
  • 2020-11-21
相关资源
最近更新 更多