您的位置:首页 > 其它

muduo库阅读(19)——日期类

2015-11-10 21:22 330 查看
儒略日Julian Day:

有效的日期范围是从公元前4713年1月1日到公元9999年12月31日。

儒略日(julian date)是自公元前4713年1月1日中午12时起经过的天数。

用途:在一些mainframe系统中及天文学中会用到这种日期格式

/*
* 日期类
*/
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.
///
class Date : public muduo::copyable
// public boost::less_than_comparable<Date>,
// public boost::equality_comparable<Date>
{
public:

/*
* 年月日结构
*/
struct YearMonthDay
{
int year; // [1900..2500]
int month;  // [1..12]
int day;  // [1..31]
};

static const int kDaysPerWeek = 7;

// 起始日期:1970-1-1
static const int kJulianDayOf1970_01_01;

Date()
: julianDayNumber_(0)
{}

Date(int year, int month, int day);

explicit Date(int julianDayNum)
: julianDayNumber_(julianDayNum)
{}

///
/// Constucts a Date from struct tm
///
explicit Date(const struct tm&);

// 交换日期
void swap(Date& that)
{
std::swap(julianDayNumber_, that.julianDayNumber_);
}

// 判断日期是否有效
bool valid() const { return julianDayNumber_ > 0; }

// 把日期转换成字符串
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;
}

int julianDayNumber() const { return julianDayNumber_; }

private:
/*
* 儒略日
* 有效的日期范围是从公元前4713年1月1日到公元9999年12月31日。
* 儒略日(julian date)是自公元前4713年1月1日中午12时起经过的天数。
* 用途:在一些mainframe系统中及天文学中会用到这种日期格式
*/
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
{

// 要求int至少为32位
char require_32_bit_integer_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1];

// 从年月日计算JulianDay,具体算法不是很清楚
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;
}

// 从JulianDay计算年月日
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);
}

using namespace muduo;
using namespace muduo::detail;

/*
* 构造函数
*/
Date::Date(int y, int m, int d)
: julianDayNumber_(getJulianDayNumber(y, m, d))
{
}

// 从tm结构构造日期类
Date::Date(const struct tm& t)
: julianDayNumber_(getJulianDayNumber(
t.tm_year+1900,
t.tm_mon+1,
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_);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: