| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 974 人关注过本帖
标题:关于将任意一个日期加1天得到一个新日期的实现!
只看楼主 加入收藏
bravetang
Rank: 1
等 级:新手上路
帖 子:11
专家分:8
注 册:2015-4-2
结帖率:100%
收藏
 问题点数:0 回复次数:5 
关于将任意一个日期加1天得到一个新日期的实现!
如题将任意一个日期加一天得到一个新的日期的实现,下面是我的一个实现,各位还有更简洁的方法吗?

日期类声明:
class Date{
    int y;
    int m;
    int d;
   
public:
    Date(int y=2000,int m=2 ,int d=29):y(y),m(m),d(d){}
    void go(); //将日期加一天。
    void show();
    void input();
    int weekday();
    int difrence();
    void printmonth();
   
    int yearOfDay();
   
    //判断一个月份是否为闰年
    static bool isLeap(int year);
    //判断一个月份是否为小月
    static bool isMall(int mouth);
    //判断一个月份是否二月份
    static bool isFabruary(int mouth);
    //求除了2月份的大小月天数
    static int noMall(int mouth);
    //求某个年份中的某一个月的天数
    static int Days(int year,int mouth);
    //判断一个数,是否在制定的范围内
    static bool in(int x,int from,int to);
    //判断一个日期是否有效
    static bool isValid(Date& d);
    friend void printDate(Date& d);
   
};

日期类部分实现:
//判断一个月份是否为闰年
bool Date::isLeap(int year)
{
    return (year%4==0 && year%100!=0)|| year%400==0;
}
//判断一个月份是否为小月
bool Date::isMall(int mouth)
{
    return (mouth==4 || mouth==6 || mouth==9 || mouth==11);
}
//判断一个月份是否二月份
bool Date::isFabruary(int mouth)
{
    return mouth == 2;
}
//求除了2月份的大小月天数
int Date::noMall(int mouth)
{
    return isMall(mouth)?30:31;
}
//求某个年份中的某一个月的天数
int Date::Days(int year,int mouth)
{
    return mouth==2?28+isLeap(year):noMall(mouth);
}
//判断一个数,是否在制定的范围内
bool Date::in(int x,int from,int to)
{
    return x>=from && x<=to;
}
//判断一个日期是否有效
bool Date::isValid(Date& d)
{
    return (d.y>1600) && in(d.m, 1, 12)
    && in(d.d, 1, Days(d.y, d.m));
}

void printDate(Date& d)
{
    cout << '(' <<d.y << "年" << d.m << "月" << d.d << "日)" << endl;
}
////////////////////////////////////////
void Date::go()        //任意日期加1天
{
    if (isMall(m)) {    //如果当前月是小月
        if (d==30) {    //如果当天为30号
            d = 0;
            m++;        //月份加1,不需要判断是否已超过12月份,因为小月最大也就11月。
        }
        d++;
    }
    else               //否则即是大月或2月
    {
        if (isFabruary(m)) {  //如果是2月
            if (isLeap(y)) {  //如果是闰年
               if (d == 29) {
                   d = 0;
                   m++;
               }
                d++;
            }else
            {
                if (d == 28) {
                    d = 0;
                    m++;
                }
                d++;
            }
        }
        else{                   //是大月
            if (d == 31) {
                d = 0;
                if (m == 12) {
                    m = 0;
                    y++;
                }
                m++;
            }
            d++;
        }
        
    }
}

void Date::show()
{
    cout << y << "年" << m << "月" << d << "日" << endl;
}
int Date::yearOfDay() //计算当天是这一年的第几天
{
    int days=0;
    if (m > 1) {
        for (int i =1; i<=m-1; i++) {
            days+=Days(y,i);
        }
    }
    days+=d;
    return days;
}
int Date::weekday() //计算当天是星期几
{
    int s,w;
    s = y-1+(y-1)/4-(y-1)/100+(y-1)/400+this->yearOfDay();
    w=s%7;
    return w;
}
搜索更多相关主题的帖子: public 
2015-04-13 22:36
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
把各月份的天数存入一个数组,然后判断是平年还是闰年,闰年的话二月变为29天

一片落叶掉进了回忆的流年。
2015-04-13 23:00
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:0 
下面是我自己封装的一个小函数! 可以加日期!~可以直接调用date例:20150404
CString Date_add(CString date,int days)
{
    CString year,month,day;
    year  = date.Mid(0,4);
    month = date.Mid(4,2);
    day   = date.Mid(6,2);

    CTime tTime( atoi(year),atoi(month),atoi(day),0,0,0);
    tTime += CTimeSpan(days,0,0,0);

    CString rdate;
    rdate.Format("%04d%02d%02d",tTime.GetYear(),tTime.GetMonth(),tTime.GetDay());

    return rdate;
}

君生我未生 我生君以老
2015-04-14 10:08
bravetang
Rank: 1
等 级:新手上路
帖 子:11
专家分:8
注 册:2015-4-2
收藏
得分:0 
回复 3楼 jcw08120110
想问一下CTimeSpan(days,0,0,0)这个函数哪来的(你自定义的吗)? 还有CTime这个类型 在哪个头文件定义的呢? 我看了<ctime>这个文件好像没发现 CTime这个类, 难道也是你自定义的吗?
2015-04-14 11:28
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
写个dateadd函数,应该不难的。

能编个毛线衣吗?
2015-04-14 11:32
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:0 
回复 4楼 bravetang
CTime是MFC中的时间类~ 可以百度哦 亲~

君生我未生 我生君以老
2015-04-17 16:33
快速回复:关于将任意一个日期加1天得到一个新日期的实现!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014978 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved