如何将std::字符串转换为boost::gregori::date
How do I convert a std::string to a boost::gregorian::date?
我正试图将std::string
转换为boost::gregorian::date
,如下所示:
using namespace boost::gregorian;
std::string str = "1 Mar 2012";
std::stringstream ss(str);
date_input_facet *df = new date_input_facet("%e %b %Y");
ss.imbue(std::locale(ss.getloc(), df));
date d;
ss >> d; //conversion fails to not-a-date-time
std::cout << "'" << d << "'" << std::endl; //'not-a-date-time'
但如果字符串包含"2012年3月1日",则转换成功。
如何将类似"2012年3月1日"的字符串转换为等效的boost::gregorian::date
?
在输入方面使用%e
似乎有问题。
Boost.Gregular文档指定:
%d以十进制01至31表示的当月日期
%e#像%d一样,一个月的哪一天是十进制数字,但前导零被空格取代
问题是,如果你查看文档的顶部,你会注意到这个警告:
用哈希符号(#)标记的标志由系统区域设置实现,并且已知在某些平台上丢失
我尝试过以下案例:
input_string = " 1"
date_format = "%e"
result = failed
input_string = "01"
date_format = "%e"
result = success
input_string = "2000 Mar 1"
date_format = "%Y %b %e"
result = failed
input_string = "2000 Mar 1"
date_format = "%Y %b %e"
result = success
input_string = "2000 Mar 01"
date_format = "%Y %b %e"
result = success
因此,这似乎是Boost实现的一个限制(或者至少是它依赖于特定的语言环境来解析%e
的事实):当%e
是输入字符串中的第一项时,解析失败,并且使用了空格而不是前导0
。
我(盲目)的猜测是,这个问题来自字符串流跳过空白的倾向。我试图用std::noskipws
找到一个解决方案,但找不到有效的解决方案。
作为一种变通方法,我建议添加一个前导零,或者如果可能,使用不同的日期格式。
另一种变通方法是手动添加空格;单词";在字符串中。我已经完成了这样一个可行的解决方案:
#include "boost/date_time/gregorian/gregorian.hpp"
#include <iostream>
#include <string>
int main(void) {
using namespace boost::gregorian;
std::string input_date("1 Mar 2000");
{ // local scope to remove temporary variables as soon as possible
std::stringstream tmp_ss(input_date);
std::string tmp;
input_date.clear(); // empty the initial string
while (tmp_ss >> tmp) {
input_date.insert(0, tmp); // insert word at beginning of string
if(tmp.size() == 1) // if word is one char long, add extra space
input_date.insert(0, " ");
input_date.insert(0, " "); // add space to separate words
}
}
std::stringstream ss(input_date);
// The order of the date is reversed.
date_input_facet *df = new date_input_facet("%Y %b %e");
ss.imbue(std::locale(ss.getloc(), df));
date d; //conversion works
ss >> d;
std::cout << "'" << d << "'" << std::endl; // ouputs date correctly.
return 0;
}
祝你好运,
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- boost::gregori::time到unix时间戳的时间为双
- 获取boost::gregori::date的整数表示形式
- 将2003年8月17日转换为boost::gregori::date
- 如何将std::字符串转换为boost::gregori::date
- 将字符串转换为boost::gregori::greg_month
- 使用boost::gregori::from_string()时发生链接器错误