1. 程式人生 > 實用技巧 >muduo原始碼解析8-date類

muduo原始碼解析8-date類

date

class date:copyable
{
};

作用:

此類作用主要是實現年月日和julianDay的互相轉換
內部最重要的一個數據成員m_julianDayNumber
在mymuduo::detail中提供了相互轉換的兩個函式getJulianDayNumber和getYearMonthDay具體如何轉換的內容沒有深究.
注意建構函式可以用julianday,年月日,struct tm三種類型去初始化,實際上都是年月日和julianDay之間的相互轉換.
toIosString 返回 格式化字串 yyyy-mm-dd
另外提供了一些返回年,月,日,周幾的函式

成員變數:

struct
YearMonthDay { 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