muduo网络库base之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)

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倚心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值