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天
static const int kJulianDayof1970_01_01;//1970.1.1至今的julianDay
private:
int m_julianDayNumber;

成员函数:

//一些构造函数,空,用年月日,julianDay,struct tm初始化内部m_julianDayNumber
date():m_julianDayNumber(){}
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>;} //格式化类型 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+)%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) ? : -];
//detail中最重要的两个函数,是实现年月日和m_julianDayNumber转换的最基本函数
//根据年月日获得julian日
int getJulianDayNumber(int year, int month, int day)
{
(void) require_32_bit_integer_at_least; // no warning please
int a = ( - month) / ;
int y = year + - a;
int m = month + * a - ;
return day + (*m + ) / + y* + y/ - y/ + y/ - ;
} //根据julian日获得年月日
struct date::YearMonthDay getYearMonthDay(int julianDayNumber)
{
int a = julianDayNumber + ;
int b = ( * a + ) / ;
int c = a - ((b * ) / );
int d = ( * c + ) / ;
int e = c - (( * d) / );
int m = ( * e + ) / ;
date::YearMonthDay ymd;
ymd.day = e - (( * m + ) / ) + ;
ymd.month = m + - * (m / );
ymd.year = b * + d - + (m / );
return ymd;
}
} const int date::kJulianDayof1970_01_01 = detail::getJulianDayNumber(, , );
}

测试:

#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(,,),dt2(*ttm);
std::cout<<dt1.julianDayNumber()<<" "<<dt2.julianDayNumber()<<std::endl;
std::cout<<dt1.toIsoString()<<std::endl; }

打印结果:

2459085 2459085
2020-08-23

muduo源码解析8-date类的更多相关文章

  1. muduo源码解析5-mutex相关类

    mutexlock和mutexlockguard class mutexlock:noncopyable { }: class mutexlockguard:noncopyable { }: 作用: ...

  2. Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了

    这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...

  3. AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍

    AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...

  4. muduo源码解析11-logger类

    logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...

  5. muduo源码解析10-logstream类

    FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...

  6. Netty源码解析 -- 内存对齐类SizeClasses

    在学习Netty内存池之前,我们先了解一下Netty的内存对齐类SizeClasses,它为Netty内存池中的内存块提供大小对齐,索引计算等服务方法. 源码分析基于Netty 4.1.52 Nett ...

  7. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  8. java源码解析之Object类

    一.Object类概述   Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解   Object的方法可以分成两类,一类是被关键字fin ...

  9. Bulma 源码解析之 .columns 类

    {说明} 这一部分的源码内容被我简化了,另外我还额外添加了一个辅助类 is-grow. .columns // 修饰类 &.is-centered justify-content: cente ...

  10. java源码解析之String类(二)

    上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...

随机推荐

  1. Day11_基本搜索

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  2. Django学习路17_聚合函数(Avg平均值,Count数量,Max最大,Min最小,Sum求和)基本使用

    使用方法: 类名.objects.aggregate(聚合函数名('表的列名')) 聚合函数名: Avg 平均值 Count数量 Max 最大 Min 最小 Sum 求和 示例: Student.ob ...

  3. 一图看懂华为云DevCloud如何应对敏捷开发的测试挑战

    作为敏捷开发中测试团队的一员,在微服务测试过程中,你是不是也遇到同样困惑:服务不具备独立验证能力.自动化用例开发效率很低等? 华为云DevCloud API全场景测试技术来支招~围绕API的全场景,打 ...

  4. 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set

    LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...

  5. windows:shellcode生成框架和加载

    https://www.cnblogs.com/theseventhson/p/13194646.html  分享了shellcode 的基本原理,核心思路是动态获取GetProcAddress和Lo ...

  6. .Net小白的第一篇博文

    说起来也比较惭愧,5个月之前,我早已创建了博客园账号,那时候的我雄心壮志,给自己定下了 很多目标.现在回想起来,除了体重的增长,头发的稀疏,似乎这段时间的消逝并没有带给我什么见识上的成长.哈哈,想必大 ...

  7. 【转】一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    [转]原文链接:https://cloud.tencent.com/developer/article/1497826 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定 ...

  8. 《RabbitMQ》如何保证消息的可靠性

    一条消费成功被消费经历了生产者->MQ->消费者,因此在这三个步骤中都有可能造成消息丢失. 一 消息生产者没有把消息成功发送到MQ 1.1 事务机制 AMQP协议提供了事务机制,在投递消息 ...

  9. HTTP POST 请求的两种编码格式:application/x-www-form-urlencoded 和 multipart/form-data

    在常见业务开发中,POST 请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用 Postman 测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-fo ...

  10. 曲线生成与求交—B样条曲线

    B样条曲线生成 Bezier曲线缺点:改变任一控制点的位置,将影响整条曲线的形状. B样条曲线是对Bezier曲线的改进,可进行局部控制,生成的曲线与控制多边形的外形更接近,将Bezier曲线作为一特 ...