在游戏服务器端的开发工作中,很多时候我们不得不面对繁琐的日期和日期处理。比如说一个运营活动的开始和结束时间处理,还有一个限时道具的到期时间处理等等。如果恰好程序的开发语言是 C++,并且框架并没有对时间处理进行过合理的封装,那么这项工作看起来就不是那么轻松愉快了。这个时候使用 time_t 类型和 tm 结构体,进行原始的时间和日期的比较和计算,就俨然成了程序员的梦魇。不过好在写 Boost 的前辈们已经帮我们做了复杂的工作,然后封装成了这个date_time 库。用来真是爽歪歪啊~

date_time 概述

在使用 date_time 库之间,我们首先要明确三个基本概念:时间点(Time Point)、时长(Time Duration)、时段(Time Interval)。所谓时间点就是时间轴上的一个特定的点;时长就是两个时间点的差值,不属于时间轴;时段是两个特定时间点之间确定的区间。基本上所有的时间处理都是围绕的这三个概念进行的。这三者可以进行相互运算,例如时间点+时长=时间点,时长+时长=时长等。

处理日期

date_time 库的日期处理基于格里高利历, 支持从 1400-01-01 到 9999-12-31 之间的日期计算。为了使用 date_time 库的日期功能需要包含头文件 <boost/date_time/gregorian/gregorian.hpp>,即:

#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;

date

date 是 date_time 库处理日期的核心类,以天为单位表示时间点概念。

date d1(2001, 1, 1); 	//使用数字构造日期
date d2(2000, Jan, 1);	//使用英文指定月份
date d3(d1);			//date 支持拷贝构造

assert(d1 == d3);		//date 支持比较操作
assert(d2 < d1);

date 也可以从一个字符串产生:

date d1 = from_string("1999-12-31");
date d2 = from_string("1999/12/31");
date d3 = from_undelimited_string("19991231");

day_clock

day_clock 是一个天级别的时钟,它也是一个工厂类,调用它的静态成员函数 local_day() 或 universal_day() 会返回一个当天的时间对象,分别是本地日期和 UTC 日期。

date d1 = day_clock::local_day();
date d2 = day_clock::universal_day();

date_duration

日期长度是一天为单位的时长,基本的日期长度是 date_duration(days)

days dd1(10), dd2(-100), dd3(255);

date_time 库还提供了 months, years, weeks 等时长类。

处理时间

date_time 库的时间功能位于命名空间 boost::posix_time,需要包含头文件 <boost/date_time/posix_time/posix_time.hpp>, 即:

#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;

time_duration

date_time 库使用 time_duration 度量时间长度,它有几个子类可以度量不同的时间分布率,分别是 hours、minutes、seconds、millisec、microsec、nanosec。

time_duration 可以在构造函数指定时分秒和微秒来构造。时分秒等值可以是任意数量,不一定必须在限度里,超出的时间会自动进位或借位。

time_duration td(1, 60, 60, 6000);

使用 time_duration 的子类可以更直观地创建时间长度

time_duration t1 = hours(1) + minutes(60) + seconds(60) + millisec(6000);

time_duration 也可以从字符串创建

time_duration td = duration_from_string(1:60:60:6000);

ptime

时间点相当于一个日期加上一个小于一天的时间长度。

ptime 是 date_time 库处理时间的核心类。最基本的创建 ptime 的方式是在构造函数中同时指定 date 和 time_duration 对象。

ptime p(date(2001,1,6), hours(1));

ptime 也可以从字符串构造

ptime p1 = time_from_string("2001-1-6 01:00:00");
ptime p1 = from_iso_string("20010106T010000"); 		// 日期与时间用T隔开

date_time 库位 ptime 也提供了时钟类,可以从时钟产生当前时间

ptime p1 = second_clock::local_time();				//秒精度
ptime p2 = microsec_clock::local_time();			//微秒精度

参考资料