muduo库阅读(19)——日期类
2015-11-10 21:22
330 查看
儒略日Julian Day:
有效的日期范围是从公元前4713年1月1日到公元9999年12月31日。
儒略日(julian date)是自公元前4713年1月1日中午12时起经过的天数。
用途:在一些mainframe系统中及天文学中会用到这种日期格式
有效的日期范围是从公元前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_); }
相关文章推荐
- WinPcap笔记(1):VisualStudio2015配置WinCap
- opencv学习笔记4
- List<T>转换为ObservableCollection<T>
- 士兵杀敌(四)(树状数组+线段树)
- 重装系统的所有过程(usb方式)
- 王家林百万大数据人才之路
- Android通过编译源代码提供系统服务
- C++中变量的声明与定义的异同
- 上传文件
- Android通过编译源代码提供系统服务-android学习之旅(85)
- Android通过编译源代码提供系统服务-android学习之旅(85)
- maven install 打包的apk,so文件丢失
- Android通过编译源代码提供系统服务-android学习之旅(85)
- Cookie与Session的区别与联系
- HTML DOM(二):节点的增删改查
- 在block按学号的升序和降序排列;按姓名的升序和降序排序,按年龄的升序和降序排列
- Android学习之随笔(一)
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(八)
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(八)
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(八)