2017-06-28 31 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

相關問題