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. Seaborn基础3

    import seaborn as sns import numpy as np import matplotlib.pyplot as plt sns.set(rc = {"figure. ...

  2. Python time asctime()方法

    描述 Python time asctime() 函数接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07 ...

  3. recv & recvfrom

    #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd, void *buf, size_ ...

  4. 文件操作之File 和 Path

    转载:https://blog.csdn.net/u010889616/article/details/52694061 Java7中文件IO发生了很大的变化,专门引入了很多新的类: import j ...

  5. 可笑,你竟然不知道 Java 如何生成 UUID

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...

  6. 无所不能的Embedding 1 - Word2vec模型详解&代码实现

    word2vec是google 2013年提出的,从大规模语料中训练词向量的模型,在许多场景中都有应用,信息提取相似度计算等等.也是从word2vec开始,embedding在各个领域的应用开始流行, ...

  7. 【SDOI2012】Longge 的问题 题解(欧拉函数)

    前言:还算比较简单的数学题,我这种数学蒟蒻也会做QAQ. --------------- 题意:求$\sum\limits_{i=1}^n gcd(i,n)$的值. 设$gcd(i,n)=d$,即$d ...

  8. 31-关键字:final

    final:最终的 1.可以用来修饰:类.方法.变量 2.具体的: 2.1 final 用来修饰一个类:此类不能被其他类所继承. * 比如:String类.System类.StringBuffer类 ...

  9. Pytorch_第五篇_深度学习 (DeepLearning) 基础 [1]---监督学习与无监督学习

    深度学习 (DeepLearning) 基础 [1]---监督学习与无监督学习 Introduce 学习了Pytorch基础之后,在利用Pytorch搭建各种神经网络模型解决问题之前,我们需要了解深度 ...

  10. Python3,逻辑运算符

    优先级 ()>not>and>or 1.or 在python中,逻辑运算符or,x or y, 如果x为True则返回x,如果x为False返回y值.因为如果x为True那么or运算 ...