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;
}