2017-06-28 18 views
0

我想在我的代码中处理日期和时间,并且已经指向了boost库的方向 - 特别是boost :: locale :: date_time(部分原因是这允许我避免夏令时奇怪使我以前的实施困难)。boost :: locale :: date_time:如何从Boost C++中的date_time对象获取数据?

但是,我得到不一致的结果。当我在date_time对象中存储日期,然后尝试从中获取数据时,这是不正确的。这里有一个例子:

#include <boost\\asio\\error.hpp> 
#include <boost\\locale.hpp> 
using namespace std; 

int main() 
{ 
    // Necessary to avoid bad_cast exception - system default should be fine 
    boost::locale::generator gen; 
    std::locale::global(gen("")); 

    // Create date_time of 12/19/2016 
    boost::locale::date_time dt = boost::locale::period::year(2016) + boost::locale::period::month(12) + boost::locale::period::day(19); 

    unsigned int month = dt.get(boost::locale::period::month()); 
    unsigned int day = dt.get(boost::locale::period::day()); 
    unsigned int year = dt.get(boost::locale::period::year()); 

    cout << month << "/" << day << "/" << year << endl; 

    // Expected output: 12/19/2016 
    // Actual output: 0/19/2017 
} 

我在做什么错了?我只想提取已保存的日期,月份,年份,小时等。

谢谢。

编辑:这是可能的,我最初以不正确的方式设置date_time。假设我有整数(而不是字符串)格式的所有相关数据,是否有明确设置日期时间的更好方法(例如,至2016年12月19日)?

+1

好了,你没有* *添加12个月的时间.... – Xirema

+0

你有没有考虑[霍华德Hinnant(欣南特)的日期/时间库(https://howardhinnant.github.io/date/date.html )? 'static_assert(2016_y/12/19 + months {12} == 2017_y/12/19,“”);' –

回答

1

2016-04-05 + 12 months = 2017-04-05。这是有道理的,因为12个月是一整年。

尝试添加11个月,然后增加以从基于0的月份调整为基于1的月份。

boost::locale::date_time dt = boost::locale::period::year(2016) + boost::locale::period::month(11) + boost::locale::period::day(19); 

uint month = dt.get(boost::locale::period::month()) + 1; 
uint day = dt.get(boost::locale::period::day()); 
uint year = dt.get(boost::locale::period::year()); 

cout << month << "/" << day << "/" << year << endl; 
+0

好的,我怎么最初设置date_time正确,假设我已经有整数格式的数据(即,我知道我在谈论12-19-2016)?也就是说,我怎么知道月份是基于0的?我怎么知道天是基于0还是日期时间的其他片段?或者有没有简单的方法来初始化已知的date_time? – user3236291

+0

@ user3236291从月份的值中减去1。将'January'等同于'0',将'December'等同于'11',并在显示日期时进行调整。 – Xirema

+0

@ user3236291如果您查看[date_time](http://www.boost.org/doc/libs/1_64_0/libs/locale/doc/html/dates_times_timezones.html)的文档,您会看到它有示例在库本身中使用''boost :: locale :: period :: january()'来获取个别月份的确切值时更加冗长/明确。 – Xirema

相关问题