// Calctime.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <sstream> 
using namespace std;

struct Date{
int year;
int month;
int day;
};

int DAY[12] ={31,28,31,30,31,30,31,31,30,31,30,31};
class TimeSrv
{
public:
TimeSrv();
~TimeSrv();
static int DateDiff(string date1, string date2, const vector<string> &holiday_vec);
private:
static inline bool IsLeap(int year);
static inline bool StringToDate(const string &date, int& year, int& month, int& day);
static inline int  ClaculateDays(Date date_max, Date date_min, const vector<string> &holiday_vec);
};

//IsLeap函数判断一个年份是否为闰年
bool TimeSrv::IsLeap(int year)
{
   return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);
}
 
//上面的StringToDate函数用于取出日期中的年月日并判断日期是否合法
//从字符中最得年月日 规定日期的格式是yyyymmdd
bool TimeSrv::StringToDate(const string &date, int& year, int& month, int& day)
{
if (date.length() < 8)
return false;

year = atoi((date.substr(0,4)).c_str());
    month = atoi((date.substr(4,2)).c_str());
    day = atoi((date.substr(6,2)).c_str());

if(IsLeap(year)){
         DAY[1] = 29;
    }
    return year >= 0 && month<=12 && month>0 && day<=DAY[month-1] && day>0;
}
 
string to_string(int src)
{
char temp[4] = {0};
sprintf(temp,"%02d",src);
return temp;
}

//计算是星期几
int CalculateWeekDay( unsigned int iYear, unsigned int iMonth, unsigned int iDay )  
{  
    int iWeek = 0;  
    unsigned int y = 0, c = 0, m = 0, d = 0;  
  
    if ( iMonth == 1 || iMonth == 2 )  
    {  
        c = ( iYear - 1 ) / 100;  
        y = ( iYear - 1 ) % 100;  
        m = iMonth + 12;  
        d = iDay;  
    }  
    else  
    {  
        c = iYear / 100;  
        y = iYear % 100;  
        m = iMonth;  
        d = iDay;  
    }  
      
    iWeek = y + y / 4 + c / 4 - 2 * c + 26 * ( m + 1 ) / 10 + d - 1;    //蔡勒公式  
    iWeek = iWeek >= 0 ? ( iWeek % 7 ) : ( iWeek % 7 + 7 );    //iWeek为负时取模  
    if ( iWeek == 0 )    //星期日不作为一周的第一天  
    {  
        iWeek = 7;  
    }  
  
    return iWeek;  
}

//根据给定的日期,去除节假日和周末计算出相差天数
int TimeSrv::ClaculateDays(Date date_max, Date date_min, const vector<string> &holiday_vec)
{
    int days = 0;

if(IsLeap(date_max.year))

DAY[1] = 29;

int M = date_min.month;
int D = date_min.day;
for(; date_min.year <= date_max.year; date_min.year++)
{
int m_end = 12;
if (date_min.year == date_max.year)
m_end = date_max.month;
for(; M<=m_end; ++M)
{
string strMonth = to_string(M);
int _day = 0;
int d_end = DAY[M-1];
if ((date_max.month == date_min.month && date_min.year == date_max.year) || //年月相同
(M == m_end && date_min.year == date_max.year)) //年相同月不同
d_end = date_max.day;

for (; D<d_end; D++)
{
int weekend = CalculateWeekDay(date_min.year,M,D);
if (weekend == 6 || weekend == 7)
continue;

string month_day = strMonth+to_string(D);
for (unsigned int H=0; H<holiday_vec.size(); H++)
{
if (month_day.compare(holiday_vec.at(H)) == 0)
{
_day--;
break;
}
}
_day++;
}
D = 1;
days += _day;
}
M = 1;
}
    return days;
}
 
int TimeSrv::DateDiff(string date1, string date2,const vector<string> &holiday_vec)
{
if (holiday_vec.empty())

cout << "节假日数据为空" << endl;

if (date1 < date2 )
swap(date1,date2);

//取出日期中的年月日
Date date_max,date_min;
if(!StringToDate(date1, date_max.year, date_max.month, date_max.day) || 
!StringToDate(date2, date_min.year, date_min.month, date_min.day))
{
cout<<"输入的日期格式不正确";
return -1;
}
int days = 0;

days = ClaculateDays(date_max, date_min, holiday_vec);

return days;
}

int main()
{
vector<string> holiday_vec;
holiday_vec.push_back("0531");
holiday_vec.push_back("0607");
holiday_vec.push_back("0611");
holiday_vec.push_back("0613");
holiday_vec.push_back("0807");
holiday_vec.push_back("0808");
holiday_vec.push_back("0101");
holiday_vec.push_back("0106");
holiday_vec.push_back("0110");

string date1 = "20180131";

string date2 = "20180101";

int a = TimeSrv::DateDiff(date1 ,date2,holiday_vec);
        cout<<date1 <<"和" << date2 << "相差 "<<a<<" 天";

system("pause");
        return 0;
}

c++ 计算2个日期相差天数,去除节假日和周末相关推荐

  1. python判断天数_Python计算两个日期相差天数的方法示例

    本文实例讲述了Python计算两个日期相差天数的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python import time import sys def dateinput() ...

  2. JavaScript计算两个日期相差天数/分钟/小时

    /*** 日期相减获取天数(用于公式计算)* @param date1 日期一 例如:"{'value':'2020-06-05','date_format':'yyyy-MM-dd'}&q ...

  3. 使用Calendar 计算两个日期相差天数,

    1.代码: public static void main(String[] args) throws ParseException {SimpleDateFormat sdf = new Simpl ...

  4. MySQL计算两个日期相差天数

    日常开发中使用mysql数据库,一定会用到的操作就是时间相关的比较. 经常会有查询今天.昨天.前七天.前30天等查询条件. 简单且准确的时间计算希望能帮到你 MySQL 计算两个日期之间的天数 TO_ ...

  5. 计算两个日期相差天数的最简洁的代码

    国际惯例,转载注明出处.大飞机: https://user.qzone.qq.com/16491848/blog/1551429397?source=namecardword 1 static voi ...

  6. kotlin 计算两个日期相差天数

    如何计算两个yyyyMMdd格式的data之间的日期天数 最近在开发一个日志库的时候遇到一个时间计算问题. 需求是这样的,日志文件夹XXX/yyyyMMdd/xxx.log,我想开发一个日志有效期时间 ...

  7. LocalDate 计算两个日期相差天数

    1.同月相差天数,月份,年份 LocalDate start = LocalDate.of(2021,5,1);LocalDate end = LocalDate.now();Period next ...

  8. Python计算两个日期相差的天数

    有时候需要算两个日期相差多少天,如果两个日期相差大,真的去数肯定很麻烦,还得计算有的是有三十天,有的是三十一天,还有闰年和平年的区别.而这时候如果有一个方法或者函数,只需要输入要计算的两个日期即可,那 ...

  9. 【时间处理】Python 计算两个日期相差的天数

    有时候需要算两个日期相差多少天,如果两个日期相差大,真的去数肯定很麻烦,还得计算有的是有三十天,有的是三十一天,还有闰年和平年的区别.而这时候如果有一个方法或者函数,只需要输入要计算的两个日期即可,那 ...

最新文章

  1. 模板网站建设究竟有哪些优势?
  2. uirecorder 启动webdriver服务报错
  3. 【线段树】Frog Traveler(CF751D)
  4. 常用html字符的转义字符串(html代码),全部转义字符备用
  5. Redis面试之传统五大数据类型的落地应用详解
  6. PyTorch 1.0 中文文档:torchvision.transforms
  7. 与Flutter第一次亲密接触-Android 视角
  8. Java 中 Comparable 和 Comparator 比较(转)
  9. wget mirror
  10. SQL获取当前日期函数
  11. php生成五星红旗,php基于GD库画五星红旗的方法_PHP
  12. 家用路由器与企业路由器有什么区别
  13. 2018上期Android学期总结
  14. Day5.牛客网剑指offer 67题之43-54题(java代码)
  15. 设计原则(3)-里氏代换原则
  16. 科学计算机怎么编程玩,如何通过可编程科学计算器在另一个设备中运行本机MFP语言编写的...
  17. Layui框架实现图片上传
  18. css3中的2D和3D转换、动画效果以及布局
  19. MySQL亿级数据分页的奇妙经历
  20. 【Qt】 Pro工程管理文件介绍

热门文章

  1. 关于我的家乡html网页设计完整版 以家乡为主题的网页设计与实现
  2. 2016年中国电信业发展趋势:管道价值回归与重塑
  3. [置顶]B-tree/B+tree/B*tree [转]
  4. Windows Terminal 自定义主题配色
  5. Linux检查4k对齐,linux查看硬盘4K对齐方法
  6. burp suite安装,点击run程序不会运行
  7. 汽车电子行业入门指南「世界上第一辆汽车诞生」
  8. java 静态类 实例化吗_Java中静态类为什么也可以实例化
  9. 联咏科技Novatek替换海思选型参考
  10. 一个14年前【取名软件】的简单逆向过程