我有一个返回格式化日期/时间字符串的函数。实际的日期和时间是不变的;它是我追求的结果字符串的格式。
std::string example_datetime(const std::string &boostspec)
{
std::ostringstream os;
os.imbue(std::locale(std::locale::classic(), new boost::posix_time::time_facet(boostspec.c_str())));
os << boost::posix_time::time_from_string("2014-02-13 08:30:00.000");
return os.fail() ? "invalid specifier" : os.str();
};
我将使用这样的函数:
std::string str(example_datetime("%a %b %d, %Y, %H:%M:%S"));
当我传递无效的boostspec
字符串时,我遇到了问题。函数中的3 rd 行在进入os.fail()
检查之前崩溃。我已经尝试捕捉到我能想到的所有异常,但似乎无法找到任何有用的东西。检查boostspec
说明符字符串的有效性是此函数的关键目的。
编辑:我正在使用boost 1.63和VS2012。 当boostspec =“%a%”时,它可靠地崩溃了 - 注意空格
答案 0 :(得分:1)
<强>更新强>
看起来MSVC的标准库实现中存在一个错误。默认情况下,Boost会将一些工作委托给std::time_put<>
:
<强> Live On http://rextester.com/TMXPG58348 强>
#include <ctime>
#include <iomanip>
#include <iostream>
int main() {
try {
// std::locale::global(std::locale("de_DE.utf8"));
std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);
std::string const fmt = "%a % ";
std::use_facet<std::time_put<char> >(std::cout.getloc())
.put({ std::cout }, std::cout, ' ', &tm, fmt.data(), fmt.data() + fmt.size());
} catch(...) {
std::cerr << "An exception was raised\n";
}
}
结果是
你的问题可能存在于其他地方:
<强> Live On Coliru 强>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
std::string example_datetime(const std::string &boostspec)
{
std::ostringstream os;
os.imbue(std::locale(std::locale::classic(), new boost::posix_time::time_facet(boostspec.c_str())));
os << boost::posix_time::time_from_string("2014-02-13 08:30:00.000");
return os.fail() ? "invalid specifier" : os.str();
}
int main() {
std::cout << example_datetime("%a % %") << std::endl;
std::cout << example_datetime("“%a % %”") << std::endl;
}
打印
Thu %
“Thu % %”
很好。