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. 十进制转换为其他进制(不使用format)

    base = [str(x) for x in range(10)] + [chr(x) for x in range(ord('A'), ord('A') + 6)] # ['0', '1', '2 ...

  2. matplotlib示例

    plt.plot 内只有一个列表示例 import matplotlib.pyplot as plt lst = [4.53,1.94,4.75,0.43,2.02,1.22,2.13,2.77] p ...

  3. python 安装 0x000007b错误解决及VC++ 安装第三方库报红

    dll 版本不对 dll 可能是 32 位和 64 位的 ,安装的可能不对 下载 DirectX_DLL修复工具v3.5增强版 进行修复 VC++ 安装第三方库报红问题 使用 VS 2017 或者 V ...

  4. PHP strripos() 函数

    实例 查找 "php" 在字符串中最后一次出现的位置: <?php高佣联盟 www.cgewang.comecho strripos("I love php, I ...

  5. MR程序的几种提交运行模式

    本地模式运行 1-在windows的eclipse里面直接运行main方法 将会将job提交给本地执行器localjobrunner 输入输出数据可以放在本地路径下 输入输出数据放在HDFS中:(hd ...

  6. CF习题集一

    CF习题集一 一.CF915E Physical Education Lessons 题目描述 \(Alex\)高中毕业了,他现在是大学新生.虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意 ...

  7. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  8. JVM进行篇

                                              结合字节码指令理解Java虚拟机栈和栈帧          栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的 ...

  9. 2019.12.9Java课堂总结

    今天在课堂上进行了练习.现进行成果及不足汇报: 1.完成了登录界面的设计 2.完成了数据库的连接. 3.完成了数据库表的设计   4.完成了变量的定义与初始化以及get.set的设立. 5.对整体框架 ...

  10. 2020-06-21:ZK的哪些基础能力构建出了哪些上层应用?

    福哥答案2020-06-21: 福哥口诀法:数负命Ma集配分(使用场景:数据发布订阅.负载均衡.命名服务.Master 选举.集群管理.配置管理.分布式队列和分布式锁) 数据发布订阅:dubbo的rp ...