2016-11-15 24 views
1

我正在使用boost date_time庫在我的應用程序中開發過濾方案。假設我有10000條記錄,每條記錄都包含一個時間戳(以毫秒爲單位)。我想使用boost將此時間戳轉換爲給定的時區,然後以毫秒爲單位返回時間部分。我使用下面的代碼片斷:boost local_date_time中沒有setter方法?

local_date_time localDate(pt, tz_ptr); 
return localDate.local_time().time_of_day().total_milliseconds(); 

在此代碼,PT是從時間戳產生(毫秒)一個的ptime對象。所有10000條記錄的時區指針都是不變的。因此,在每次迭代中創建一個local_date_time對象是浪費的。如果可能的話,我想重用這個對象。我正在尋找一種方法,如:

localDate.set(ptime pt); 

但我找不到這樣的東西。任何人都知道這樣的事情是否存在?

+0

我認爲這裏的代碼可能太少,可能對您有幫助,但是如果我理解正確,您希望返回'localDate.local_time()。time_of_day()。total_milliseconds()',但爲了做到這一點需要從'pt'(這是常量)生成'localDate'。爲什麼'localDate'不是一個類的成員,並且在構造它時會從毫秒初始化'pt'並將它傳遞給'localDate',那麼函數可以返回成員? – Tas

+0

似乎沒有像上面這樣的方法。你的過濾器如何工作?也許這會更容易轉換查詢時間,而不是存儲的數據? –

+0

@Tas:對不起,如果不是很清楚。每條記錄都有一個UTC時間戳。我需要轉換爲給定的時區。爲了做到這一點,我基本上必須在循環的每次迭代中創建一個local_date_time對象並返回時間部分。我的問題是我是否可以創建一個local_date_time對象。在循環的每次迭代中,我應該將時間戳設置爲ptime到local_date_time,並在適當的時區對其進行轉換。問題是我沒有找到local_date_time的setter方法。 – ToyElephant

回答

3

「因此,它是一種浪費在每次迭代創建LOCAL_DATE_TIME對象」

你有看了看發出的程序集?我認爲你在過早地優化。

ptime的想法是「不可變的價值型」。 local_date_time也一樣。這裏的一個複雜因素是庫設計者使用共享所有權來模擬時區實例(出於很好的理由)。

這實際上是您應該擔心的唯一部分。我會先計算出時區偏移量,然後只是放棄local_date_time。

CAVEAT如果這樣做,請確保您佔用dst/non-dst日期!偏移量會有所不同。我不確定升壓/操作系統是否考慮到了歷史時區的變化。

這也可能是最好使用升壓日期時間的區域實施,只是做原料轉換,而不LOCAL_DATE_TIME

的幫助另一種方式避開了很多複雜的是考慮使用

  • boost::date_time::c_local_adjustor<ptime>
  • boost::date_time::local_adjustor<ptime>

請參閱http://www.boost.org/doc/libs/1_62_0/doc/html/date_time/examples.html#date_time.examples.local_utc_conversion

+0

感謝您的建議。我使用local_adjustor,它比local_date_time執行得更好。我看到的一個問題是,我們必須指定沿dst/no dst選項的小時偏移。 – ToyElephant