当前位置:C++技术网 > 资讯 > 跨月跨年输出打印的日期序列(日期刻度)简单实现

跨月跨年输出打印的日期序列(日期刻度)简单实现

更新时间:2016-10-25 17:19:56浏览次数:1+次

    刚刚看了之前写的一份代码,是连续打印一段日期,支持跨月打印,甚至跨年打印。不过,却发现一个问题。这个问题还是找了很久才发现的。
    因为连续打印日期跨月,需要区分月份的天数,结果在9月份到十月份时间这一段时间内,9月份竟然算出了31天。然后后面的天数的数据就错位了。开始一直以为是数据输出或者界面绘制的问题,竟然败给了日期计算。
    日期计算非常麻烦,要考虑到闰年闰月,二月份的天数。还有月大月小的处理。因为是自己计算,所以还要处理日期加减的问题,代码一多,就出问题了。
    回头想想,日期计算这样的问题,如果我们利用系统的时间机制,不就可以搞定了吗?自己写问题多多。
    C++的开发习惯,尽量自己写。此时会增加自己的负担,容易引起更多错误。这一点,需要引起C/C++程序员的注意。在现成的开发环境中,一定要尽可能多利用现成的工具,不能自己开小灶。不仅开发效率低了,而且质量不一定得到保证。像基础的处理,能够想象到系统会提供,就去熟悉系统提供的做法来实现。如果真想自己写,业余时间写着玩,也可以,不要用在工作中,增加压力和负担。等业余的写好了,可以用来项目中。
    之前写的一大堆代码,现在看看都有点头疼,处理的细节比较多。现在用MFC的CTime和CTimeSpan来实现,就很简单了。
    我将打印日期列表的代码封装为一个函数,大家可以自己直接拿去测试:
CString Ctmp_timeDlg::ShowDaysList(CString start_time,int day_count)
{
    COleDateTime oletime; 
    oletime.ParseDateTime(start_time); 
    SYSTEMTIME systime; 
    oletime.GetAsSystemTime(systime); 
    CTime tm = CTime(systime); 

    CTimeSpan ts(1,0,0,0);//1天
    CString str;
    for (int i=0;i<day_count;i++,tm+=ts)
    {
        str += tm.Format(_T("%Y-%m-%d")) +_T("\n");
    }
    return str;
}

    测试代码:
CString str = ShowDaysList(_T("2016-7-10"),40);
MessageBox(str);

    效果图:
输出打印跨越月份的日期列表
    这个可以用于日期坐标画日期刻度,可以准确的跨越跨年来画刻度,不会出现多一天少一天的尴尬。而且代码简单。再自己写这样的基础代码,而不用系统的,来练手或者来锻炼,就剁手吧。自己的代码,不仅代码量大,心累,而且会埋下很多Bug。不划算,不要给自己增加加班的原因。