muduo网络库 Timestamp时间戳类
人类与计算机度量某一时刻的时间的区别
我们在平常生活中习惯以"2023-01-24 18:45:01.000000"的方式来查看时间,这是这种以字符串风格的方式并不便于在计算机的比较和计算,因此在计算机中是以自纪元时间(Epoch时间 1970-01-01 00:00:00 +000000 )以来的时间戳来表示,精度为1us(微秒)。
目录
一: Timestamp类的设计
class Timestamp : public muduo::copyable,
public boost::equality_comparable<Timestamp>,
public boost::less_than_comparable<Timestamp>
{
public:
///
/// Constucts an invalid Timestamp.
///
Timestamp()
: microSecondsSinceEpoch_(0)
{
}
explicit Timestamp(int64_t microSecondsSinceEpochArg)//构造函数用explicit,防止隐式转换。
: microSecondsSinceEpoch_(microSecondsSinceEpochArg)
{
}
static const int kMicroSecondsPerSecond = 1000 * 1000;
private:
int64_t microSecondsSinceEpoch_;
};
Timestamp类的总体框架如上图所示,该类继承自muduo库中的copyable类,凡是从该类继承下来的均可看作是被设计成了值语义。原因是希望时间戳能够在不同变量之间赋值,拷贝。
这里解释一下值语义与对象语义;
值语义是指:该类是可以被拷贝的,并且拷贝之后与原对象脱离关系(深拷贝)。
对象语义是指: 该类可以被拷贝也可以是不能拷贝,但是一旦拷贝之后仍然和原对象存在一定的关系(浅拷贝)。
该类的成员变量为microSecondsSinceEpoch_,代表的是从Epoch(1970-01-01 00:00:00)时间到现在的微秒数。这里microSecondsSinceEpoch_的类型为int64_t,因为32位不足以用以微秒为单位来表示时间戳,而int64_t则可以表示290余年的微秒数,而且有符号的64位还可以进行时间戳之间的差值i计算。
还有一个成员变量
static const int kMicroSecondsPerSecond = 1000 * 1000;
由于1 second =1000000 microseconds因此被设置为1000 * 1000;
1. 返回一个无效时间的时间对象
static Timestamp invalid()
{
return Timestamp();
}
函数体内是一个return Timestamp(); 这时我们就要看一下Timestamp类的无参构造函数了,该函数返回的是一个时间戳为0的对象,因此该对象为无效对象。
Timestamp()
: microSecondsSinceEpoch_(0)
{
}
2. 返回以当前的时间戳来构造的一个Timestamp对象
static Timestamp now();//声明
Timestamp Timestamp::now()//定义
{
struct timeval tv;
gettimeofday(&tv, NULL);
int64_t seconds = tv.tv_sec;
return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);
}
首先先介绍一下gettimeofday函数
gettimeofday函数是在linux系统下获取当前时间戳,分辨率为1us
获取之后在tv结构体里分别使用tv_sec和tv_usec计算出总的微秒数。然后用总的微秒数构建一个时间戳对象返回。
3. static Timestamp fromUnixTime(time_t t) 和 static Timestamp fromUnixTime(time_t t, int microseconds)
static Timestamp fromUnixTime(time_t t)
{
return fromUnixTime(t, 0);
}
static Timestamp fromUnixTime(time_t t, int microseconds)
{
return Timestamp(static_cast<int64_t>(t) * kMicroSecondsPerSecond + microseconds)