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_);}
阅读全文
0 0
- muduo库源码学习(base)Date
- muduo库源码学习(base)Atomic
- muduo库源码学习(base)AsyncLogging
- muduo库源码学习(base)Condition
- muduo库源码学习(base)CountDownLatch
- muduo库源码学习(base)Exception
- muduo库源码学习(base)FileUtil
- muduo库源码学习(base)mutex
- muduo库源码学习(base)singleton
- muduo库源码学习(base)ThreadLocal
- muduo库源码学习(base)ThreadLocalSingleton
- muduo库源码学习(base):Logfile
- muduo库源码学习(base):LogStream
- muduo库源码学习(base):WeakCallback
- muduo库源码学习(base)BlockingQueue和BoundBlockingQueue
- muduo库源码学习(base)Thread和CurrentThread
- [Muduo网络库源码分析] (10) base/ThreadPoll_cc_h_线程池
- muduo源码学习(1)
- mesos、marathon、chronos使用
- 本月腾讯,阿里,美团等技术团队的精品文章推送
- MySQL 5.6 for Windows 解压缩版配置安装
- 实时分析百度统计的数据?互联网人定要看!
- BZOJ 1673 浅谈深度优先式搜索及斐波拉契启发式AstaR剪枝
- muduo库源码学习(base)Date
- Android O_GO后台启动服务改动
- P2S、P2P、P2SP之对比
- 学习metasploit漏洞总结
- HTML5权威指南笔记:16-理解CSS(内容简介)
- RView
- 微服务架构下,如何实现分布式跟踪?
- 【BigHereo 38】---L11---C++错题总结
- 网络获取视屏播放