muduo原始碼解析8-date類
阿新 • • 發佈:2020-08-23
date
class date:copyable { };
作用:
此類作用主要是實現年月日和julianDay的互相轉換
內部最重要的一個數據成員m_julianDayNumber
在mymuduo::detail中提供了相互轉換的兩個函式getJulianDayNumber和getYearMonthDay具體如何轉換的內容沒有深究.
注意建構函式可以用julianday,年月日,struct tm三種類型去初始化,實際上都是年月日和julianDay之間的相互轉換.
toIosString 返回 格式化字串 yyyy-mm-dd
另外提供了一些返回年,月,日,周幾的函式
成員變數:
structYearMonthDay { int year; //1900-2500 int month; //1-12 int day; //1-31 }; public: static const int kDaysPerWeek=7; //一週7天 static const int kJulianDayof1970_01_01;//1970.1.1至今的julianDay private: int m_julianDayNumber;
成員函式:
//一些建構函式,空,用年月日,julianDay,struct tm初始化內部m_julianDayNumber date():m_julianDayNumber(0){} date(int year,int mon,int day); explicit date(int julianDayNum):m_julianDayNumber(julianDayNum){} explicit date(const struct tm&); //交換兩個date型別,實際上交換內部m_julianDayNumber的值 void swap(date& that) { std::swap(this->m_julianDayNumber,that.m_julianDayNumber); }//m_julianDayNumber是否>0 bool valid()const {return m_julianDayNumber>0;} //格式化型別 yyyy-mm-dd string toIsoString() const; //返回年月日型別 YearMonthDay yearMonthDay() const; //返回:年,月,日,周幾 int year() const{return yearMonthDay().year;} int month() const{return yearMonthDay().month;} int day() const{return yearMonthDay().day;} int weekDay() const { return (m_julianDayNumber+1)%kDaysPerWeek; } //獲取內部資料成員m_julianDayNumber int julianDayNumber()const{return m_julianDayNumber;}
detail名稱空間內部重要函式:
namespace mymuduo { namespace detail{ char require_32_bit_integer_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1]; //detail中最重要的兩個函式,是實現年月日和m_julianDayNumber轉換的最基本函式 //根據年月日獲得julian日 int 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; } //根據julian日獲得年月日 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); }
測試:
#include"base/date.h" #include<iostream> namespace mymuduo{ namespace currentthread { void cacheTid() { } } } int main() { struct tm* ttm; time_t tt=time(NULL); ttm=localtime(&tt); mymuduo::date dt1(2020,8,23),dt2(*ttm); std::cout<<dt1.julianDayNumber()<<" "<<dt2.julianDayNumber()<<std::endl; std::cout<<dt1.toIsoString()<<std::endl; }
列印結果:
2459085 2459085
2020-08-23