ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

muduo 库解析之三:Date

2021-04-24 19:35:05  阅读:139  来源: 互联网

标签:muduo int 之三 number month year Date day


源码

Date.h

#include "Copyable.h"

#include <time.h>
#include <string>

namespace muduo
{
    class Date : public 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;

        Date():julian_day_number_(0){}
        explicit Date(int julianDayNum):julian_day_number_(julianDayNum){}
        Date(int year,int month,int day);
        explicit Date(const struct tm&);

        void swap(Date& that)
        {
            std::swap(julian_day_number_,that.julian_day_number_);
        }

        bool valid() const {return julian_day_number_ > 0;}
        //@ convert to yyyy-mm-dd format
        std::string to_iso_string() const;
        struct YearMonthDay year_month_day() const;

        int year()const
        {
            return year_month_day().year;
        }

        int month()const
        {
            return year_month_day().month;
        }

        //@ [0,1...6] => [Sunday,Monday...Saturday]
        int week_day() const
        {
            return (julian_day_number_ + 1) % kDaysPerWeek;
        }

        int julian_day_number() const
        {
            return julian_day_number_;
        }

    private:
        int julian_day_number_;

    };

    inline bool operator<(Date x,Date y)
    {
        return x.julian_day_number() < y.julian_day_number();
    }

    inline bool operator==(Date x,Date y)
    {
        return x.julian_day_number() == y.julian_day_number();
    }
}

Date.cc

#include "Date.h"


namespace muduo
{
    namespace detail
    {
        char require_32_bit_interger_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1];

        //@ algorithm reference:http://www.faqs.org/faqs/calendars/faq/part2/
        int get_julian_day_number(int year,int month,int day)
        {
            (void) require_32_bit_interger_at_least;
            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 get_year_month_day(int julian_day_number)
    {
        int a = julian_day_number + 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::get_julian_day_number(1970,1,1);

    Date::Date(int year,int month,int day):julian_day_number_(detail::get_julian_day_number(year,month,day))
    {
    }

    Date::Date(const struct tm& t):julian_day_number_(detail::get_julian_day_number(t.tm_year+1900,t.tm_mon+1,t .tm_mday))
    {
    }

    std::string Date::to_iso_string() const
    {
        char buf[32];
        YearMonthDay ymd(year_month_day());
        snprintf(buf,sizeof(buf),"%04d-%02d-%02d",ymd.year,ymd.month,ymd.day);
        return buf;
    }

    Date::YearMonthDay Date::year_month_day() const
    {
        return detail::get_year_month_day(julian_day_number_);
    }
}

标签:muduo,int,之三,number,month,year,Date,day
来源: https://www.cnblogs.com/xiaojianliu/p/14697801.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有