1 类说明
- 功能:
- 时间戳及对应的功能,以μs微秒为单位
- 继承:
- muduo::copyable(空基类,标识类)
- 标签类,表示可以这是复制的类。(值语义)
- boost::equality_comparable< Timestamp >
- 类只要实现对operator==就会自动实现!=。(
a != b
相当于!(a == b)
)
- 类只要实现对operator==就会自动实现!=。(
- boost::less_than_comparable< Timestamp >
- 继承使用此类可以只重写operator< ,剩下的<= ,>会自动生成. (
a <= b
相当于b < a
)、(a > b
相当于b < a
)
- 继承使用此类可以只重写operator< ,剩下的<= ,>会自动生成. (
- muduo::copyable(空基类,标识类)
2 成员变量说明
- microSecondsSinceEpoch_
- 顾名思义,以μs微秒为单位的时间戳,类型为
int64_t
,1 s = 10^6 μs。这个数值是距离时间纪元1970-01-01 00:00:00
的微秒数。
- 顾名思义,以μs微秒为单位的时间戳,类型为
- kMicroSecondsPerSecond
- 静态成员变量,指明一秒有多说微秒(1s = 100000μs)。(命名规范常量用k(小写)开头命名)
3 成员函数说明
1 non-static
- 构造函数:两个版本,一个是无参数,一个有一个int64_t的值
- 初始化microSecondsSinceEpoch_
- swap
- 交换两个Timestamp
- toString
- 转为string
- toFormattedString
- 转化为格式化string
- valid
- 检查microSecondsSinceEpoch_是否大于0
- microSecondsSinceEpoch
- 返回microSecondsSinceEpoch_时间戳的值
- secondsSinceEpoch,返回类型是
time_t
也即是long int
- 转换为秒,microSecondsSinceEpoch_ / kMicroSecondsPerSecond
2 static
- now
- 利用timeval结构体,获得当前秒数,从而获得微秒数并返回Timestamp类型
- invalid
- 返回一个微秒数为0的Timestamp对象
- fromUnixTime
- 将Unix时间(
time_t
)转为Timestamp类型
- 将Unix时间(
3 inline(非成员函数)
在头文件的函数,如果只有声明,没有定义,当引用头文件需要链接到其他.o文件,没有就会报错undefined reference
如果有定义,且不为inline,当有多个文件引用到该头文件时会报错multiple reference
-
重载 < 和 ==
- 都是直接比较microSecondsSinceEpoch_
-
timeDifference
- 返回两个时间戳之差(以秒返回)
-
addTime
- Timstamp加上传入秒数
4 测试
- 用当前时间构造一个Timestamp对象,转换成字符串并打印
- 将上面的对象以值传递和引用传递方式传递到函数进行打印
- 时间衡量:将100个now的Timestamp对象放进vector,计算第一个和最后一个之差的时间。并且计算vector中相邻两个Timestamp对象之差。
5 其他
-
static_assert关键字:用来做编译期间的断言。语法:static_assert(常量表达式,提示字符串)。当表达式为true时,什么都不做;当表达式为false,产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。
- PRI64:int64_t用来表示64位整数,在32位系统中是long long int,而在64位系统中是long int,所以在打印int64_t的格式化方法(这种方法不太合适)
printf("%ld", value)
// 64bit OSprintf("%lld", value)
// 32bit OS
- 跨平台做法:(会自动转换成上面的)
#ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #include <inttypes.h> prinf("%" PRId64 \n", value)
muduo中的:
snprintf(buf, sizeof(buf), "%" PRId64 ".%06" PRId64 "", seconds, microseconds);
- PRI64:int64_t用来表示64位整数,在32位系统中是long long int,而在64位系统中是long int,所以在打印int64_t的格式化方法(这种方法不太合适)
Todo: TimeZone源码分析