Есть некоторая проблема с синтаксисом datetime, что я понятия не имею о большом обходном пути.boost date parse 29FEB
Рассмотрим следующий код:
#include <iostream>
#include <string>
#include <boost/date_time/gregorian/gregorian.hpp>
namespace dt = boost::gregorian;
dt::date parse_date(const std::string& msg, const std::string& format)
{
std::stringstream s(msg);
dt::date_input_facet * f = new dt::date_input_facet();
if (format.empty())
{
f->set_iso_format();
}
else
{
f->format(format.c_str());
}
std::locale l(std::locale(), f);
s.imbue(l);
dt::date result;
s >> result;
return result;
}
int main()
{
const std::string v = "0229";
auto p = parse_date(v, "%m%d");
std::cout << p << std::endl;
}
Проблема в том, что год по умолчанию в даты и времени парсера 1400
, что не високосный, так что не 29 февраля в этом году. Главный вопрос, конечно, почему 1400
год по умолчанию, а не какой-либо високосный год, в любом случае мне нужно какое-то хорошее обходное решение, любые идеи?
Существует partial_date, но, к сожалению, он не соблюдает строчную строку, которую он использует. Если «2902» вместо «0229» будет работать, он может использовать [это] (http://coliru.stacked-crooked.com/a/8c53d94f3c5e1f44). – llonesmiz
Хорошая находка, @cv_and_he. Интересно, насколько полезен «partial_date» для других задач (будет выглядеть в один прекрасный день). Вот [версия X3] (http://coliru.stacked-crooked.com/a/752c3ab1fdd5b4e3) для полноты – sehe
Интересно. Конечно, у меня есть идея просто добавить год, но мне это не нравится, но, наверное, это лучше. И это очень интересное решение, используя partial_date. – ForEveR