提升日期解析29FEB
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
,这不是闰年,所以今年没有2月29日。当然,主要的问题是为什么1400
年是默认的,而不是任何闰年,无论如何,我需要一些好的变通方法,有什么想法吗?
我认为"为什么"这个问题并不特别相关。这就是它的工作方式。关键是你知道是什么阻止你解析它
我只想做下面简单的事情,或者只写一个小的spirit解析器(两次int_parser<unsigned char, 10, 2, 2>
)并直接构造一个ptime
)。
在Coliru上直播
#include <iostream>
#include <string>
#include <boost/date_time/gregorian/gregorian.hpp>
namespace dt = boost::gregorian;
dt::date parse_date_mmdd(const std::string &msg) {
std::stringstream s("2000" + msg);
dt::date_input_facet *f = new dt::date_input_facet();
f->format("%Y%m%d");
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_mmdd(v);
std::cout << p << std::endl;
}
打印
2000-Feb-29
cco答案可能集中在"没有与DayOfYear
相关的数据类型"作为DayOfMonth元组(在日期处理库中没有使用它)。因此,你总是要决定一个有背景的年份。就像你总是要决定在哪个时区解释posix时间,甚至使用哪个日历模型。
相关文章:
- 查询SQLite数据库中的日期
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- Log4cpp:以UTC/GMT时区打印日期
- 使用C++的日期库读取时间
- 日期格式为C++
- 如何在 C++20 计时中为日期添加天数?
- 如何在QTableView中排序和更改日期格式
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- fmt 与 Howard Hinnant 的日期:为什么从 fmt::to_string "{}"?FMT 和日期的最佳实践?
- 使程序检查当前日期是否=预期日期
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 确定夏令时是否适用于特定日期
- C++日期库因时区而失败
- 向日期运算符添加天数+
- 为什么在C++中获取日期和/或时间如此复杂?
- 如何验证用户输入月份的日期?
- 从编译时已知的日历日期创建"std::chrono::time_point"
- 提升日期解析29FEB