gpt4 book ai didi

c++ - 如何将 std::string 转换为 boost::gregorian::date?

转载 作者:可可西里 更新时间:2023-11-01 17:39:29 30 4
gpt4 key购买 nike

我正在尝试将 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'

但如果字符串中包含“01 Mar 2012”,则转换成功。

如何将“2012 年 3 月 1 日”之类的字符串转换为等效的 boost::gregorian::date

最佳答案

这似乎是在您的输入方面使用 %e 的问题。

Boost.Gregorian documentation指定:

%d       Day of the month as decimal 01 to 31

%e #    Like %d, the day of the month as a decimal number, but a leading zero is replaced by a space

问题是如果你查看文档的顶部,你会注意到这个警告:

The flags marked with a hash sign (#) are implemented by system locale and are known to be missing on some platforms

我试过以下情况:

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

我的(盲目)猜测是这个问题来自 stringstream 跳过空格的倾向。我试图用 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;
}

祝你好运

关于c++ - 如何将 std::string 转换为 boost::gregorian::date?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9516183/

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