2016-11-15 44 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