muduo库Timestamp、Date、TimeZone分析

先了解关于时间的一个结构体和获取时间的一个函数。

#include <time.h>struct timeval {__time_t tv_sec;/* Seconds. */__suseconds_t tv_usec; /* Microseconds. */ };

tv_sec指从Epoc到现在的秒数。 tv_usec指从Epoch到现在的微秒数。 Epoch指的是一个特定的时间:1970-01-01 00:00:00 UTC。

获取时间的函数

#include <sys/time.h>int gettimeofday(struct timeval* tv,struct timezone× tz )

把当前时间信息放到tv中,把当地时区信息放到tz中(如果不需要可以为NULL)。这个函数是C库提供的函数,在封装实现中调用了sys_gettimeofday系统调用,所以归根到底还是调用了系统调用。

更多关于时间的内容,参考这里

Timestamp类

类结构代码如下:

class Timestamp : public muduo::copyable,public boost::less_than_comparable<Timestamp>{ public: Timestamp(); explicit Timestamp(int64_t microSecondsSinceEpochArg); void swap(Timestamp& that); string toString() const; string toFormattedString(bool showMicroseconds = true) const; bool valid() const { return microSecondsSinceEpoch_ > 0; } int64_t microSecondsSinceEpoch() const ; time_t secondsSinceEpoch() const; static Timestamp now(); static Timestamp invalid(); static Timestamp fromUnixTime(time_t t) static Timestamp fromUnixTime(time_t t, int microseconds); kMicroSecondsPerSecond = 1000 * 1000; private: int64_t microSecondsSinceEpoch_;};

继承public muduo::copyable表示可以复制,即值传递。继承public boost::less_than_comparable表示可以作大小比较(!=,>,<=,>=);在实现时,只需实现<和==即可,其他可以自动生成;比较运算符的重载是以友元的形式实现的。

变量microSecondsSinceEpoch_保持着Epoch到现在的微秒数,为了方便微秒和秒之间的转换,定义了const static变量kMicroSecondsPerSecond。microSecondsSinceEpoch_是int64_t类型,在32位和64位计算机有不同的类型表示,如下定义所示:

# if __WORDSIZE == 64typedef long intint64_t;# else__extension__typedef int64_t;#endif

里面定义的一下函数,有些是为了获取一定格式时间;与string相关的是为了把时间转换为string格式。可以用来测试一下,获取当前时间,转换为string.

muduo;int main(){Timestamp timeStamp=Timestamp::now();printf(“it’s %lld microseconds from Epoch\n”, timeStamp.microSecondsSinceEpoch());string str= timeStamp.toString();printf(“sting format is %s\n”, str.c_str());return 0;}Date类

类代码如下:

class Date : public muduo::copyable{ public: struct YearMonthDay {day; // [1..31] }; kDaysPerWeek = 7; kJulianDayOf1970_01_01; Date(); Date(int year, int month, int day); explicit Date(int julianDayNum); explicit Date(const struct tm&); void swap(Date& that); bool valid() const { return julianDayNumber_ > 0; } string toIsoString() const; struct YearMonthDay yearMonthDay() const; int year() const; int month() const; int day() const; // [0, 1, …, 6] => [Sunday, Monday, …, Saturday ] int weekDay() const; int julianDayNumber() const { return julianDayNumber_; } private: int julianDayNumber_;};

日期是采用Julian day来表示的,什么是Julian day,大概来说就是现在到公元前4713年1月1日的天数,具体可以参考维基百科这里或百度百科这里。

私有变量julianDayNumber_存储着这个天数,定义了结构体YearMonthDay方便两者之间的转换,toIosString把日期转换为string。

可以测试一下:

muduo;int main(){Date date(2015,7,27);int julianDayNum=date.julianDayNumber();std::cout<<“Julian Day Num is”<<julianDayNum<<std::endl;Date date2(julianDayNum);struct Date::YearMonthDay yearMonthDay=date2.yearMonthDay();std::cout<<yearMonthDay.year<<“–“<<yearMonthDay.month<<“–“<<yearMonthDay.day<<std::endl;return 0;}TimeZone类

先看个数据结构

#include <time.h>struct tm {tm_hour;tm_mon;tm_wday;tm_isdst;/* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/};如果你希望成功,以恒心为良友,以经验为参谋,以小心为兄弟,以希望为哨兵。

muduo库Timestamp、Date、TimeZone分析

相关文章:

你感兴趣的文章:

标签云: