muduo库源码学习(base)Date

来源:互联网 发布:淘宝客点击数少 编辑:程序博客网 时间:2024/06/05 11:52
muduo在时间上选择的是tm和timeSpec
struct tm;namespace muduo{//// Date in Gregorian calendar.//// This class is immutable.// It's recommended to pass it by value, since it's passed in register on x64.////格林格兰历//保存的julian date是自公元前4713年1月1日中午12时起经过的天数。这样比较大小的时候比较方便。。class Date : public muduo::copyable{ public:  struct YearMonthDay  {    int year; // [1900..2500]    int month;  // [1..12]    int day;  // [1..31]  };  static const int kDaysPerWeek = 7;  static const int kJulianDayOf1970_01_01;//linux纪元日197011的编号。。。  //  // Constucts an invalid Date.  //  Date()    : julianDayNumber_(0)  {}  //  // Constucts a yyyy-mm-dd Date.  //  // 1 <= month <= 12  Date(int year, int month, int day);  ///  /// Constucts a Date from Julian Day Number.  ///  explicit Date(int julianDayNum)    : julianDayNumber_(julianDayNum)  {}  ///  /// Constucts a Date from struct tm  ///  explicit Date(const struct tm&);  // default copy/assignment/dtor are Okay  void swap(Date& that)  {    std::swap(julianDayNumber_, that.julianDayNumber_);  }  bool valid() const { return julianDayNumber_ > 0; }  ///  /// Converts to yyyy-mm-dd format.  ///  string toIsoString() const;  struct YearMonthDay yearMonthDay() const;  int year() const  {    return yearMonthDay().year;  }  int month() const  {    return yearMonthDay().month;  }  int day() const  {    return yearMonthDay().day;  }  // [0, 1, ..., 6] => [Sunday, Monday, ..., Saturday ]  int weekDay() const  {    return (julianDayNumber_+1) % kDaysPerWeek;//0,6不是工作日,也就是周六日  }  int julianDayNumber() const { return julianDayNumber_; } private:  int julianDayNumber_;};inline bool operator<(Date x, Date y){  return x.julianDayNumber() < y.julianDayNumber();}inline bool operator==(Date x, Date y){  return x.julianDayNumber() == y.julianDayNumber();}}


namespace muduo{namespace detail{char require_32_bit_integer_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1];// algorithm and explanation see:// http://www.faqs.org/faqs/calendars/faq/part2/// http://blog.csdn.net/Solsticeint getJulianDayNumber(int year, int month, int day){  (void) require_32_bit_integer_at_least; // no warning please  int a = (14 - month) / 12;  int y = year + 4800 - a;  int m = month + 12 * a - 3;  return day + (153*m + 2) / 5 + y*365 + y/4 - y/100 + y/400 - 32045;}struct Date::YearMonthDay getYearMonthDay(int julianDayNumber){  int a = julianDayNumber + 32044;  int b = (4 * a + 3) / 146097;  int c = a - ((b * 146097) / 4);  int d = (4 * c + 3) / 1461;  int e = c - ((1461 * d) / 4);  int m = (5 * e + 2) / 153;  Date::YearMonthDay ymd;  ymd.day = e - ((153 * m + 2) / 5) + 1;  ymd.month = m + 3 - 12 * (m / 10);  ymd.year = b * 100 + d - 4800 + (m / 10);  return ymd;}}const int Date::kJulianDayOf1970_01_01 = detail::getJulianDayNumber(1970, 1, 1);//in namespace muduo}using namespace muduo;using namespace muduo::detail;Date::Date(int y, int m, int d)  : julianDayNumber_(getJulianDayNumber(y, m, d)){}Date::Date(const struct tm& t)  : julianDayNumber_(getJulianDayNumber(        t.tm_year+1900,//tm year-1900        t.tm_mon+1,//0-11        t.tm_mday)){}string Date::toIsoString() const{  char buf[32];  YearMonthDay ymd(yearMonthDay());  snprintf(buf, sizeof buf, "%4d-%02d-%02d", ymd.year, ymd.month, ymd.day);  return buf;}Date::YearMonthDay Date::yearMonthDay() const{  return getYearMonthDay(julianDayNumber_);}