gpt4 book ai didi

c++ - 如何将 boost::ptime 转换为字符串

转载 作者:IT老高 更新时间:2023-10-28 22:34:19 26 4
gpt4 key购买 nike

我在将 ptime 对象从 boost 转换为要传递给函数的字符串时遇到问题。关于将 boost 时间对象输出到字符串(主要是 cout),我发现了多个类似的其他线程,但我在它们上发现的都没有工作。

看来最简单的方法是将 ptime 对象插入到字符串流中,然后使用字符串流的字符串。正如其他线程上的一些答案所暗示的那样,我还尝试为字符串流注入(inject) time_facet。但是,我无法创建 time_facet 对象。它给了我类模板的参数列表丢失的错误。令人困惑的是,互联网上没有任何地方提到 time_facet 的参数列表,甚至 boost 的文档页面也显示 time_facet 的默认构造函数仅仅是 time_facet()。

以下是我尝试过的简单版本:

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

boost::posix_time::ptime time = boost::posix_time::time_from_string("1981-08-20 08:05:00");
std::stringstream sstream;
sstream << time;
_updateStatement->setString(1, (sql::SQLString)sstream.str());

在字符串流中插入时间给了我一堆类似于

的编译错误
error C2220: warning treated as error - no 'object' file generated C:\code\trunk\Development\External\boost\include\boost/date_time/time_facet.hpp(247) :while compiling class template member function 'boost::date_time::time_facet<time_type,CharT>::time_facet(size_t)'
with
[
time_type=boost::posix_time::ptime,
CharT=char
]

尽管我没有使用任何 time_facet 对象。

当我尝试使用 time_facet 对象执行此操作时,我添加了

sstream.imbue(std::locale(sstream.getloc(), new boost::date_time::time_facet("%Y-%m-%d %H:%M:%S")));

在将时间插入字符串流之前。错误在于它需要本文顶部提到的参数列表。

在 boost 中是否有一个函数与 boost::posix_time::time_from_string() 相反?如果没有,任何其他帮助将不胜感激。谢谢。

最佳答案

Boost.Date_Time 库提供以下 ptime to std::string conversionsboost::posix_time 命名空间内:

  • std::string to_simple_string(ptime) 返回 YYYY-mmm-DD HH:MM:SS.fffffffff 格式的字符串 where mmm 是三个字符的月份名称。
  • std::string to_iso_string(ptime) 返回 YYYYMMDDTHHMMSS,fffffffff 形式的字符串,其中 T 是日期时间分隔符.
  • std::string to_iso_extended_string(ptime) 返回 YYYY-MM-DDTHH:MM:SS,fffffffff 形式的字符串,其中 T 是日期时间分隔符。

此外,流插入和提取operators提供,允许从流中插入或提取 ptime。可以通过使用各种 format flags 构建构面来自定义输入和输出格式,然后在流中注入(inject)刻面。

根据编译错误 (C2220),编译器设置为将所有警告视为错误。在某些情况下,Boost 库编译时会出现警告。考虑评估实际警告的严重性,并从那里适本地处理它。例如,如果警告是微不足道的,使用 warning pragma 可能是可以接受的。禁用或抑制特定警告。


这里是 complete example演示通过其提供的转换函数和流运算符将 ptime 转换为字符串。

#include <iostream>
#include <locale>
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>

int main()
{
const boost::posix_time::ptime time =
boost::posix_time::time_from_string("1981-08-20 08:05:00");

// ptime to string.
const std::string str_time = to_simple_string(time);
std::cout << str_time << std::endl;

// ptime to stringstream to string.
std::stringstream stream;
stream << time;
std::cout << stream.str() << std::endl;
stream.str("");

// Use a facet to display time in a custom format (only hour and minutes).
boost::posix_time::time_facet* facet = new boost::posix_time::time_facet();
facet->format("%H:%M");
stream.imbue(std::locale(std::locale::classic(), facet));
stream << time;
std::cout << stream.str() << std::endl;
}

产生以下输出:

1981-Aug-20 08:05:00    
1981-Aug-20 08:05:00
08:05

关于c++ - 如何将 boost::ptime 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com