首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求计算当前日期前N天前的日期的算法(VC++),该如何处理

2012-02-04 
求计算当前日期前N天前的日期的算法(VC++)比如2007-03-0130天前日期是2007-01-30(要区分闰年和月大月小)[

求计算当前日期前N天前的日期的算法(VC++)
比如2007-03-01         30天前日期是2007-01-30(要区分闰年和月大月小)

[解决办法]
这个好像加一些判断就可以做的,只有几条规则,就算是做成真值表都不大的。
[解决办法]
直接用个Date类型减不可以吗?
[解决办法]
在C里面有一个函数mktime()可以计算从1970-1-1开始的所有日期的加减法,非常好用。
[解决办法]
一个比较接近的程序:
#include <stdio.h>
#define judge(y) (y%4==0)&&(y%100!=0)||(y%400==0)
int allday(int x);
int month1[]={31,28,31,30,31,30,31,31,30,31,30,31};
int month2[]={31,29,31,30,31,30,31,31,30,31,30,31};

void main()
{ int i;

int yea1,yea2,mon1,mon2,day1,day2;
int *p;

long jia_day1=0;
long jia_day2=0;
long jia_day3=0;
long jia_day4=0;
long jia_all=0;

printf( "请输入第一个年月份\n ");
scanf( "%d %d %d ",&yea1,&mon1,&day1);
printf( "请输入第二个年月份\n ");
scanf( "%d %d %d ",&yea2,&mon2,&day2);
if(judge(yea1)) printf( "%d是闰年\n ",yea1);
if(judge(yea2)) printf( "%d是闰年\n ",yea2);
if(yea1> yea2)
{ if(judge(yea2)) p=month2;
else p=month1;
jia_day1=*(p+mon2-1)-day2;
for(i=mon2;i <=11;i++)
jia_day2=jia_day2+*(p+i);
for(i=yea2+1;i <yea1;i++)
jia_day3=jia_day3+allday(i);
if(judge(yea1)) p=month2;
else p=month1;
for(i=1;i <mon1;i++)
jia_day4=jia_day4+*(p+i-1);
jia_all=jia_day1+jia_day2+jia_day3+jia_day4+day1;
printf( "%d%d%d比%d%d%d迟%d天\n ",yea1,mon1,day1,yea2,mon2,day2,jia_all);
}
else if(yea1 <yea2)
{ if(judge(yea1)) p=month2;
else p=month1;
jia_day1=*(p+mon1-1)-day1;
for(i=mon1;i <=11;i++)
jia_day2=jia_day2+*(p+i);
for(i=yea1+1;i <yea2;i++)
jia_day3=jia_day3+allday(i);
if(judge(yea2)) p=month2;
else p=month1;
for(i=1;i <mon2;i++)
jia_day4=jia_day4+*(p+i-1);
jia_all=jia_day1+jia_day2+jia_day3+jia_day4+day2;
printf( "%d%d%d比%d%d%d迟%d天\n ",yea2,mon2,day2,yea1,mon1,day1,jia_all);
}
else
{ if(judge(yea1)) p=month2;
else p=month1;
if(mon1> mon2)
{ jia_day1=*(p+mon2-1)-day2;
for(i=mon2+1;i <mon1;i++)
jia_day2=jia_day2+*(p+i-1);
jia_all=jia_day1+jia_day2+day1;
printf( "第一个时间比第二个时间迟%d天\n ",jia_all);
}
else if(mon1 <mon2)
{ jia_day1=*(p+mon1-1)-day1;
for(i=mon1+1;i <mon2;i++)
jia_day2=jia_day2+*(p+i-1);
jia_all=jia_day1+jia_day2+day2;
printf( "第一个时间比第二个时间早%d天\n ",jia_all);
}
else
{if(day1> day2)
printf( "第一个时间比第二个时间迟%d天\n ",(day1-day2));
else if(day1 <day2)
printf( "第一个时间比第二个时间早%d天\n ",(day2-day1));
else printf( "这俩个时间相等\n ");
}
}
}



int allday(int x)
{ int y;
if(((x%4==0)&&(x%100!=0))||((x%100==0)&&(x%400==0)))
{y=366; printf( "在这俩个数据中:%d是闰年\n ",x);}
else y=365;
return (y);
}
[解决办法]
求的是第二天的程序,楼主自己扩展成求差别N天的吧:


#include <stdio.h>
#include <stdlib.h>

int main()
{
int y,m,d;
int f, fwrong=0;

printf( "y,m,d= ");
scanf( "%d%d%d ",&y,&m,&d); /*输入格式: 1996 2 28, 空格分割数据*/

f= ( (y%4==0) && (y%100!=0) ) || (y%400==0);
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(d <31)d++;
else if(d == 31)
{
if(m != 12){m++; d=1;}
else {y++; m=1; d=1;}
}
else {fwrong=1; printf( "The date is wrong!!\n ");}
break;

case 4:
case 6:
case 9:
case 11:
if(d <30)d++;
else if(d == 30){m++; d=1;}
else {fwrong=1; printf( "The date is wrong!!\n ");}
break;

case 2:
if(f)
{
if(d <28)d++;
else if(d == 28){m++; d=1;}
else {fwrong=1; printf( "The date is wrong!!\n ");}
break;
}
else
{
if(d <29)d++;
else if(d == 29){m++; d=1;}
else {fwrong=1; printf( "The date is wrong!!\n ");}
break;
}
}
if(!fwrong)
printf( "The date of next day is %d,%d,%d ", y, m, d);
system( "PAUSE ");
return 0;
}
[解决办法]
给楼主提供一个我以前写的类吧,里面有求某年某月某日之后多少天是什么日子的成员函数,楼主可以改造一下。写的不好,不过希望能给楼主带来点启发吧。

#include <iostream>

class Date{

public:
class Bad_date { };
Date(int year = 2000,int month = 1,int day = 1); // 构造函数

inline void printDate()
{
std::cout < < "Year: " < <Date::y < <std::endl;
std::cout < < "Month: " < <Date::m < <std::endl;
std::cout < < "Day: " < <Date::d < <std::endl;
}

Date& add(int day); // 某年某月某日后加多少天得到的日期
int distance(Date a);
bool validate() // 正确性验证函数,如果日期正确,则返回true,否则返回false
{
return (y != 0 && m != 0 && d != 0);
}

int year()
{
return y;
}
int month()
{
return m;
}
int day()
{
return d;
}


private:

int y,m,d;


};


Date::Date(int year,int month,int day) // 构造函数
{
bool is_leap;
if (year > 0)
{
y = year;
if (( y % 4 == 0 && y % 100 != 0 ) || y % 400 == 0) // 如果用户提供的年份是闰年
is_leap = true;
else
is_leap = false;

m = month;
switch(month)
{
case 1: // 当大月时
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
m = month;
if (day > = 1 && day <= 31)
{
d = day;
break;
}
else
{
d = 0;
break;
}
}
case 4: // 小月时
case 6:
case 9:
case 11:
{
m = month;
if (day > = 1 && day <= 30)
{
d = day;
break;
}
else
{
d = 0;
break;
}
}
case 2: // 2月时
{
m = month;
if (day > = 1 && day <= 29 && is_leap)
{
d = day;
break;
}
else if (day > = 1 && day <= 28 && !is_leap)


{
d = day;
break;
}
else
{
d = 0;
break;
}
}
default:
m = 0;
}
}
else
y = 0;
}


Date& Date::add(int day)
{
d += day;

while (d > 30)
{
switch(m)
{
case 1: // 当大月时
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
if (d > 31)
{
d -= 31;
m++;
break;
}
else
break;
}
case 2: // 当2月时
{
if (( y % 4 == 0 && y % 100 != 0 ) || y % 400 == 0) // 当当前年份是闰年时
{
d -= 29;
m++;
break;
}
else // 不是闰年时
{
d -= 28;
m++;
break;
}
}
case 4: // 小月时
case 6:
case 9:
case 11:
{
d -= 30;
m++;
break;
}
default: // 当月份增加后已经超出12月时
{
y++; // 向前加一年
m -= 12; //求出新的月份
break;
}
}

if (d == 31)
break;

if (m > 12)
{
m -= 12;
y++;
}
}
return *this;
}


int Date::distance(Date a)
{
bool sm_front; // 用于判断两个将要求差的年份的大小
int n = 0;
if (this -> year() < a.year())
sm_front = true;
else if (this -> year() > a.year())
sm_front = false;
else
{
if (this -> month() < a.month())
sm_front = true;
else if (this -> month() > a.month())
sm_front = false;
else
{
if (this -> day() < a.day())
sm_front = true;
else
sm_front = false;
}
}

if (sm_front)
{
while ((*this) != a)
{
(*this).add(1);
n++;
}
return n;
}
else
{
while (*this != a)
{
a.add(1);
n++;
}
return n;

}
}

bool operator == (Date a,Date b)
{
return a.year() == b.year() && a.month() == b.month() && a.day() == b.day();
}

bool operator != (Date a,Date b)
{
return a.year() != b.year() || a.month() != b.month() || a.day() != b.day();
}

[解决办法]
mark
[解决办法]
如果是MFC的话,用CDateTime对象减去一个4天的CTimeSpan对象不就得出结果了吗?
[解决办法]
time_tmp=time(NULL);
tm_now=localtime(&time_tmp);
tm_now-> tm_mday=tm_now-> tm_mday-30;/*天数*/
time_tmp=mktime(tm_now);
tm_now=localtime(&time_tmp);
printf( "%04d %02d %02d\n ",tm_now-> tm_year+1900,tm_now-> tm_mon+1,tm_now-> tm_mday);

[解决办法]
先把日期转成已秒为单位的整型值,在减去几天的秒数,然后在转成日期就OK了,全用标准C库函数。
[解决办法]
楼主不是说vc吗,用这么费劲吗?
[解决办法]
change to FILETIME, then minus the interval, at last, change the FILETIME to SYSTEMTIME.


[解决办法]
CTime tCurrent(2007, 3, 1, 0, 0, 0);
CTimeSpan tsDays(1, 0, 0, 0); //要减几天都可以

CTime tPrev = tCurrent - tsDays;
[解决办法]
我的blog有源代码,如果要编译好的程序,给我email。

http://my.opera.com/fantast_xue/blog/show.dml/818977

结合使用方法读源代码,事半功倍!

热点排行