先了解关于时间的一个结构体和获取时间的一个函数。
#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()为负。*/};如果你希望成功,以恒心为良友,以经验为参谋,以小心为兄弟,以希望为哨兵。