C++ 已知起始时期、截止日期,计算相差多少天

48 篇文章 8 订阅
18 篇文章 0 订阅

1、全局变量

int g_nSurplusDays = 0;     //剩余天数

int g_nCheckYear = 1901;     //校验年份
int g_nCheckMonth = 0;       //校验月份
int g_nCheckDay = 0;         //校验日
int g_nCheckHour = 0;        //校验时
int g_nCheckMinute;          //校验分

int g_nEndYear = 0;          //截止年份
int g_nEndMonth = 0;         //截止月份
int g_nEndDay = 0;           //截止日
int g_nEndHour = 0;          //截止时
int g_nEndMinute = 0;        //截止分

2、日期管理类

datemanagement.h

#ifndef DATEMANAGEMENT_H
#define DATEMANAGEMENT_H
#include<iostream>
using namespace std;

struct MyDate
{
    int year;      //year
    int month;     //month
    int day;      //day in month
    int hour;
    int minute;
};


class DateManagement
{
public:
    DateManagement();

    //年份的最低限制
    const int m_nMinYear = 1900;

    //判断是否是闰年
    bool isLeap(int y);

    //判断 y年m月 共有的天数
    int daysOfMonth(int y, int m);

    //计算一共的天数
    int daysOfDate(MyDate date);

    //计算一天已过的分钟
    int minutesOfDay(MyDate date);

    //判断日期是否被篡改
    bool compareDates(MyDate startDate, MyDate endDate);
};

#endif // DATEMANAGEMENT_H

 datemanagement.cpp

#include "datemanagement.h"
#include <QDebug>

DateManagement::DateManagement()
{

}

//判断是否是闰年
bool DateManagement::isLeap(int y)
{
    if((y % 4 == 0) && (y % 100 != 0))      //是闰年
        return true;
    else if(y % 400 == 0)                   //是闰年
        return true;
    else                                    //不是闰年
        return false;
}

//判断 y年m月 共有的天数
int DateManagement::daysOfMonth(int y,int m)
{
    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(m != 2)
        return days[m-1];
    else
        return 28 + isLeap(y);
}

//计算一共的天数
int DateManagement::daysOfDate(MyDate date)
{
    if(date.year <= m_nMinYear)
    {
        return 0;
    }

    int days = date.day;

    //计算年
    for(int y = m_nMinYear; y < date.year; y++)
        days += 365 + isLeap(y);

    //计算月
    for(int m = 1; m < date.month; m++)
        days += daysOfMonth(date.year, m);

    return days;
}

//计算一天已过的分钟
int DateManagement::minutesOfDay(MyDate date)
{
    int minutes = date.minute;
    minutes += date.hour * 60;

    return minutes;
}

//判断日期是否被篡改
bool DateManagement::compareDates(MyDate startDate, MyDate endDate)
{
    int startDays = daysOfDate(startDate);
    int endDays = daysOfDate(endDate);

    //如果结束日期的总天数 大于 开始日期的总天数,则日期没被篡改
    if(endDays > startDays)
        return false;
    else if(endDays < startDays)        //如果结束日期的总天数 小于 开始日期的总天数,则日期被篡改
        return true;
    else        //结束日期的总天数 等于 开始日期的总天数
    {
        int startMinutes = minutesOfDay(startDate);
        int endMinutes = minutesOfDay(endDate);
        if(endMinutes >= startMinutes)      //如果结束日期当天总分钟 大于或等于 开始日期当天总分钟,则日期没被篡改
            return false;
        else
            return true;
    }
}

3、计算相差天数

原理:分别计算起始日期、结束日期 与 1900年相差天数,然后再对二者作比较。

void calSurplusDays()
{
    //获取系统时间
    QDateTime local(QDateTime::currentDateTime());
    int nLocalTime_Year = local.toString("yyyy").toInt();
    int nLocalTime_Month = local.toString("MM").toInt();
    int nLocalTime_Day = local.toString("dd").toInt();
    int nLocalTime_Hour = local.toString("hh").toInt();
    int nLocalTime_Minute = local.toString("mm").toInt();
	
	//日期管理类 对象
    DateManagement dateManage;
    MyDate startDate;
    MyDate endDate;      //开始、结束日期

	//重新记录校验时间
	g_nCheckYear = nLocalTime_Year;
	g_nCheckMonth = nLocalTime_Month;
	g_nCheckDay = nLocalTime_Day;
	g_nCheckHour = nLocalTime_Hour;
	g_nCheckMinute = nLocalTime_Minute;

    //开始日期(最后一次校验日期)
    startDate.year = g_nCheckYear;
    startDate.month = g_nCheckMonth;
    startDate.day = g_nCheckDay;
    startDate.hour = g_nCheckHour;
    startDate.minute = g_nCheckMinute;
    //截止日期
    endDate.year = g_nEndYear;
    endDate.month = g_nEndMonth;
    endDate.day = g_nEndDay;
    endDate.hour = g_nEndHour;
    endDate.minute = g_nEndMinute;

    //计算相差天数
    int startDays = dateManage.daysOfDate(startDate);
    int endDays = dateManage.daysOfDate(endDate);
    int startMinutes = dateManage.minutesOfDay(startDate);
    int endMinutes = dateManage.minutesOfDay(endDate);

    if(endDays == startDays)
    {
        if(endMinutes > startMinutes)
            g_nSurplusDays = 1;
        else
            g_nSurplusDays = 0;
    }
    else if(endDays > startDays)
    {
        g_nSurplusDays = endDays - startDays;
    }
    else
        g_nSurplusDays = 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值