2017-08-16 49 views
-1

我有一個按時間鍵控的表,C++中的時間查找表11

time | valA | valB 
---- | ---- | ---- 
09:00| 1.4 | 1.2 
09:05| 1.5 | 1.4 
09:10| 1.5 | 1.4 

我想將它存儲在任意時間的數據結構和查詢值中。例如。

asof 09:01, valA = 1.4 
asof 09:06, valB = 1.4 
asof 09:14, valA = 1.5 

在C++ 11中構造這個的最佳方法是什麼?我應該使用哪個std :: chrono數據類型來表示我的時間。我如何開發支持時區的解決方案?例如。在我的表中列出的時間可能在美國/中央時間,我可能想用澳大利亞/悉尼時間查詢。

回答

0

爲了支持與<chrono>不同的時區當地時間,我推薦Howard Hinnant's free, open-source time zone library。此庫建立在<chrono>之上,並使用IANA time zone database來管理時區。

另外,要處理時區,您需要存儲的不僅僅是時間。您需要存儲整個日期,因爲時區的UTC偏移量通常會隨日期而變化。即09:05 Australia/Sydney並沒有真正確定時間。但2017-08-16 09:05 Australia/Sydney呢。

這裏是你如何能與<chrono>創建這樣的時間戳和時區庫:

using namespace date; 
using namespace std::chrono; 
auto zt = make_zoned("Australia/Sydney", local_days{2017_y/aug/16} + 9h + 5min); 

你可以把它打印出來是這樣的:

std::cout << zt << '\n'; 

,輸出爲:

2017-08-16 09:05:00 AEST 

如果您想了解美國/中環當地時間, s到這同一時刻:

auto zt2 = make_zoned("US/Central", zt); 
std::cout << zt2 << '\n'; 

,輸出是:

2017-08-15 18:05:00 CDT 

date::zoned_time<std::chrono::seconds>是在這些例子ztzt2的類型,而這正是我建議你保存。在這種情況下,這種類型是{date::time_zone const*, std::chrono::time_point<system_clock, seconds>}(兩個字的存儲)的配對。

的源代碼:https://github.com/HowardHinnant/date

文檔:http://howardhinnant.github.io/date/tz.html

視頻:https://www.youtube.com/watch?v=Vwd3pduVGKY

+0

感謝霍華德,你的庫看起來不錯,可惜我不能安裝任何額外的庫。我只有標準庫。 – nickos556