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. __name__=='__main__'作用

    .pyw:python源文件,常用语图形界面程序文件.pyc:Python字节码文件 举个例子吧!!先写一个py文件,命名为MyModule.py,里面内容如下: def mymain(): prin ...

  2. 小伙子自从学会用Python爬取岛国“动作”电影,身体一天不如一天

    在互联网的世界里,正确的使用VPN看看外面的世界,多了解了解世界的发展.肉身翻墙后,感受一下外面的肮脏世界.墙内的朋友叫苦不迭,由于某些原因,VPN能用的越来越少.上周我的好朋友狗子和我哭诉说自己常用 ...

  3. 职场老鸟,一文教你如何正确入门Python爬虫!

    爬虫现在的火热程度我就不说了,先说一下这门技术能干什么事儿,主要为以下三方面: 1.爬取数据,进行市场调研和商业分析 爬取知乎.豆瓣等网站的优质话题内容:抓取房产网站买卖信息,分析房价变化趋势.做不同 ...

  4. 能动手绝不多说:开源评论系统remark42上手指南

    能动手绝不多说:开源评论系统 remark42 上手指南 前言 写博客嘛, 谁不喜欢自己倒腾一下呢. 从自建系统到 Github Page, 从 Jekyll 到 Hexo, 年轻的时候谁不喜欢多折腾 ...

  5. Docker 快速搭建 LDAP

    Docker 快速搭建 LDAP 步骤 # 拉取镜像 docker pull osixia/openldap:1.3.0 # 创建并进入映射目录 mkdir -p /usr/local/ldap &a ...

  6. Spring Cloud 之分布式配置基础应用

    分布式配置基础应用 配置中心服务 spring-config-server pom.xml <?xml version="1.0" encoding="UTF-8& ...

  7. canvas图片编辑操作:缩放、移动、保存(PC端+移动端)

    最近在写canvas关于图片的操作,看了网上的代码基本都是不行的,于是就自己写了一个. html代码 <canvas id="myCanvas" width="37 ...

  8. C#LeetCode刷题之#404-左叶子之和​​​​​​​​​​​​​​(Sum of Left Leaves)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4084 访问. 计算给定二叉树的所有左叶子之和. 3      / ...

  9. arm-linux-gcc-4.4.3.tar.gz

    http://u.163.com/xzbSXC6T 提取码: QNk9KsMH

  10. Golang笔记整理--One day

    题外话: 很早就有整理学习笔记的想法,今天将想法付诸于行动,将Golang相关知识系统整理一遍,此分类为Golang学习笔记,最近开始学习这门语言的同学可以参考. 一 第一个Go程序: hello.g ...