积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

此篇文章打算介绍两个,在平时工作中,使用频繁并且十分有价值的功能。(因为你的项目不用到还好,只要用到,下面这两个一般是必不可少)
功能点1:将本地时间转成格林威治时间,或者是将格林威治时间转成本地时间。
功能点2:将时间转成时间戳,以及如何将时间戳转成时间。
有些人可看刚看到上面的功能点概述,可能会觉得这没什么难的。也的确,事实上,确实不难。但如果你要是没真正处理过的话,可能一时还真会壁。比如:功能点1,将本地时间转成格林威治时间。因为我们根本不知道我们当前的本地时间与标准时间的时差到底是多少。所以你要怎么转??(我们不能单纯地认为,我们是中国人,所以时差都是8个小时。那如果你的游戏要是发布到世界其他国家了??那时差就完全不同。甚至就算是中国,你在上海,跟在西藏,那时间也是有差别的。因此,我们需要根据本地时刻值,精确地计算出与标准时间的时差。从而才可以准确转换成格林威治时间。看下面处理方法:
a) 将格林威治时间转成标准时间
 ptime CommonHelper::utcToLocal(ptime utctime)
 {
  return boost::date_time::c_local_adjustor<ptime>::utc_to_local(utctime);
  //说明:c_local_adjustor对象的utc_to_local()接口就是用来处理本地时间跟标准时间的偏差的。
  //此处所谓的本地时间,并不是固定指说北京时间。而是你的计算处在地球的哪条经线上,该经线
  //跟格林威治所处的经线的时差量。(我刚看到这个功能时,实在太让我惊讶了都!)

  //但是有一点需要注意:boost中,只提供了标准时间转本地时间的上述接口,却没有
  //直接提供将本地时间转成标准时间的接口。不过,既然有了utc_to_loca()这样的神兵利器
  //我们同样可以很方便地处理将本地时间转成标准时间的问题。见如何:
 }

b) 将本地时间转成格林威治时间
ptime CommonHelper::localToUtc(ptime ltime)
 {
  return ltime - (utcToLocal(epoch) - epoch);
  //说明:(utcToLocal(epoch) - epoch)这部分内容您的计算机的当地时差量(如果是在北京,那就是8小时)
 }

接下来介绍一下第二部分的功能点。即:功能点2:将时间转时间戳以及将时间戳转时间
c) 将boost中的时间转成时间戳,其实很简单。中需要做如下处理即可。(在此就不多说)
 WE::int64 CommonHelper::getUTCTimestamp()
 {  
  return (microsec_clock::universal_time() - epoch).total_milliseconds();
 }

d) 此处重点介绍一下,如何将时间戳转成时间。这个确实有点令人头痛。为什么这么说?因为时间戳,其实只是一个
数量值。这个数量值记载的信息的意义是指:自:1970-1-1到指定时刻所走过的时间量值。如此,或许有人就会说,
既然你都说了,是从1970到指定时刻的量值,两个时间相加不就好了。确实是这样子的,但有个小问题是:因为我们
没法清楚这个量值的单位是什么。如果单位是:毫秒,而你把它当成秒或当成微秒来处理,结果都将是错的。关于这点,
其实boost有个时间处理的决策“的开关”,这个似乎还要看自己编译的boost的lib是使用到哪个精度的级别。关于这块
本人暂时还没深入到这方面,所以也不敢妄言。不过,有个接口,大家可以参考着使用下。time_duration::resolution()
这个就可以用来识别,当前系统中boost在时间这方面使用到的精度值。(例如本人目前项目中,使用到的是微秒级别的。
所以返回值为:micro。)
下面给他几种实现时间戳转时间的小例子:(以下假定,时间戳的单位为毫秒)
e) 通过接口:from_time_t();
ptime time_5 = from_time_t(timestamp);
f) 通过time_duration
milliseconds xx(time_1_stamp);
ptime xxxxxxxxxxxx = CommonHelper::epoch + xx;
g) 直接通过手动计算。此方法实现思路很简单,但操作起来个人感觉易错。写的代码量又多,所以本人还是建议使用上面两种,特别是第2种
假如:timestamp是时间戳。则先计算出它的小时,再计算出它的分钟,计算出它的秒数,最后计算出它的毫秒数。然后与commonhelper::epoch相加即可。
注意:上面的e) f) g) 其实还是有区别的。用e)跟f)转出来的精度值方面会不中方法g)。但在项目使用中,前两者计算出来的精度值,一般
情况下,是绝对可够的。这是一个注意点,给大家提醒一下。

好了,这篇文章暂时就先写到这吧。。其实关于boost时间,还有非常多的内容可以挖掘,改天有机会再写吧。希望对大伙有帮助。
如果有错误之处,还请指教。:)
posted on 2013-01-02 16:27 Jacc.Kim 阅读(2936) 评论(0)  编辑 收藏 引用 所属分类: VC / C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理